Swift:将通用变量约束为类或协议

时间:2019-11-09 16:41:12

标签: swift generics inheritance generic-programming swift-protocols

由于ii在Swift中无法转换为超级类型,因此我想编写一个类型擦除的版本,该版本表示可以将其值转换为特定协议或超级类型的任何Inventory_Name

KeyPath

编译器正确地抱怨

  

类型“ T”限于非协议,非类类型“ ValueType.Type”

KeyPath可能是结构类型。

那么我们如何适当地限制呢?这是在强制执行

  1. public struct PropertyGetter<Root, ValueType> { private let keyPath: PartialKeyPath<Root> public init<T: ValueType>(_ keyPath: KeyPath<Root, T>) { self.keyPath = keyPath } public func get(_ instance: Root) -> ValueType { return instance[keyPath: self.keyPath] as! ValueType } } 是类类型或协议,即可子类化/可实现
  2. ValueType被约束为符合ValueType,即T必须保证工作,其中ValueType

请注意,在协议类型固定的情况下,确实可以编写这样的类型擦除结构。例如,仅接受指向x as! ValueType成员的x: T的类:

KeyPath

0 个答案:

没有答案