[英]Protocol Conformance Extension for some UIControls
这是我的情况:
我希望2个或更多UIControl符合通用协议:例如UISlider
, UIStepper
, MyCustomControl
。 这就是他们所拥有的:
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.