ios – 对MutableCollectionType的Swift扩展不使用泛型类型数组

我在UIView上有一个扩展,它根据元类型返回一个子视图数组.这样我可以查询视图层次结构,例如所有UITextFields等.

extension UIView {
    func subviewsOfType<T:UIView>(_:T.Type) -> [T]? {
        ...
    }
}

这可以像这样调用:

let fields = loginView.subviewsOfType(UITextField.self)

现在,我想在该数组[UITextField]上使用与传入的泛型相匹配的接口,换句话说,UITextField上可用的任何内容,例如:

fields.alpha = 0.3 // via UIView
fields.enabled = false // via UIControl

我在MutableCollectionType上创建了扩展来提供这些覆盖:

extension MutableCollectionType where Generator.Element == UIView {

    var alpha:CGFloat {
        get {
            if let first = self.first {
                return first.alpha
            } else {
                return 1.0
            }
        }
        set {
            for view in self {
                view.alpha = newValue
            }
        }
    }
}

extension MutableCollectionType where Generator.Element == UIControl {

    var enabled:Bool {
        get {
            if let first = self.first {
                return first.enabled
            } else {
                return true
            }
        }
        set {
            for view in self {
                view.enabled = newValue
            }
        }
    }
}

但是,当我尝试使用这些扩展时,它们无法按预期工作. 🙁

以下是我尝试过的调用代码的变体及其错误:

Ambiguous reference to member alpha

Cannot assign to property fields is let constant

Cannot assign to immutable expression of type

Ambiguous reference to member enabled

或者,我尝试使用方法而不是计算属性,例如

func alpha(alpha:CGFloat) -> Self {
    for view in self {
        view.alpha = alpha
    }
    return self
}

这“有效”,但包括难看的铸造:

Using setters

我更喜欢通过MutableCollectionType扩展在这些数组上使用常规属性:

loginView.subviewsOfType(UITextField.self).enabled = true

我错过了什么?

最佳答案
你已经完全限制了UIView,而不是UIView的子类.你的意思是:

extension MutableCollectionType where Generator.Element: UIView { ... }
extension MutableCollectionType where Generator.Element: UIControl { ... }

注意:而不是==.

在这种特殊情况下,您需要将字段变为var,因为您将其变异:

if var fields = loginView.subviewsOfType(UITextField.self) {
    fields.alpha = 0.3
    fields.enabled = true
}

转载注明原文:ios – 对MutableCollectionType的Swift扩展不使用泛型类型数组 - 代码日志