由于ii
在Swift中无法转换为超级类型,因此我想编写一个类型擦除的版本,该版本表示可以将其值转换为特定协议或超级类型的任何Inventory_Name
:
KeyPath
编译器正确地抱怨
类型“ T”限于非协议,非类类型“ ValueType.Type”
KeyPath
可能是结构类型。
那么我们如何适当地限制呢?这是在强制执行
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
}
}
是类类型或协议,即可子类化/可实现ValueType
被约束为符合ValueType
,即T
必须保证工作,其中ValueType
请注意,在协议类型固定的情况下,确实可以编写这样的类型擦除结构。例如,仅接受指向x as! ValueType
成员的x: T
的类:
KeyPath