繁体   English   中英

某些UIControl的协议一致性扩展

[英]Protocol Conformance Extension for some UIControls

这是我的情况:

我希望2个或更多UIControl符合通用协议:例如UISliderUIStepperMyCustomControl 这就是他们所拥有的:

class UIStepper {
  var value: Float
}

class UISlider {
  var value: Double
}

class MyCustomControl {
  var value: Int
}

现在,我喜欢类似于这样的协议的东西:

protocol Valuable {
  associatedtype T
  var value: T
}

然后能够使用[Valuable] 但当然我遇到了着名的PATs问题

协议Valuable只能用作通用约束,因为它具有Self或关联类型要求

我已经看过类型擦除的方法和类似于在线的东西。 但我觉得我正在努力做的事情有些混乱。 我希望能够拥有一个具有value属性的Controls数组,并且此属性只能是原始类型 当然,我可以继续创建多个数组,如[IntValuable][DoubleValuable][FloatValuable]来绕过它。 或者也许在某处某处使用NSNumber。 或带有相关值的枚举。 或者也许有一些我没有看到的东西,因此我在这里发帖:)我很感激一点指导! 谢谢。

从你的问题我不清楚你的需求是什么。 怎么样:

enum Numeric {
    case int(Int)
    case double(Double)
    case float(Float)

    init(_ int: Int) {
        self = .int(int)
    }

    init(_ double: Double) {
        self = .double(double)
    }

    init(_ float: Float) {
        self = .float(float)
    }        
}

protocol Valuable {
    var numericValue: Numeric { get set }
}

extension UISlider: Valuable {
    var numericValue: Numeric {
        get { return .double(value) }
        set { value = newValue.value }
    }
}

等等,用于其他控件。 然后,分配:

let slider: UISlider()
slider.numericValue = Numeric(3.14159)

我最终这样做的方式如下:

protocol Valuable {
    func set(value: NSNumber)
}

extension UIStepper: Valuable {
    func set(value: NSNumber) {
        self.value = value.doubleValue
    }
}

extension UISlider: Valuable {
    func set(value: NSNumber) {
        self.value = value.floatValue
    }
}

然后我可以这样做:

var valuables: [Valuable] = [UISlider(), UIStepper()]

for valuable in valuables {
    valuable.set(value: 5)
}

通过这种方式,我可以轻松地为任何类添加更多扩展,即使其中的变量不是命名value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM