gpt4 book ai didi

ios - MutableCollectionType 的 Swift 扩展不适用于泛型类型数组

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:03 27 4
gpt4 key购买 nike

我在 UIView 上有一个扩展,它返回一个基于元类型的 subview 数组。这样我就可以查询 View 层次结构,例如所有 UITextFields 等。

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

可以这样调用:

let fields = loginView.subviewsOfType(UITextField.self)

现在,我想对该数组 [UITextField] 进行操作,其接口(interface)与传入的泛型相匹配,换句话说,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 { ... }

注意 : 而不是 ==

在这种特殊情况下,您需要将 fields 设为 var,因为您对其进行了变异:

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

关于ios - MutableCollectionType 的 Swift 扩展不适用于泛型类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com