我正在使用一个第三方库,在我的用例中,它会给我下一个“[有吗?]'阵列。此数组包含可等式结构对象,定义如下:
struct SplitValue<L: Equatable, R: Equatable> {
public var left: L?
public var right: R?
public init(left: L?, right: R?){
self.left = left
self.right = right
}
}
extension SplitValue: Equatable {
public static func ==(lhs: SplitValue, rhs: SplitValue) -> Bool {
return lhs.left == rhs.left && lhs.right == rhs.right
}
}
这是我正在处理的数组的一个简单示例:
var values = [Any?]()
values.append(SplitValue<String, Int>(left: "a", right: 12))
values.append(SplitValue<Double, String>(left: 33.1, right: "b"))
现在假设我无法预测在SplitValue.left和SplitValue.right属性中找到哪些值类型。它可以是String、Int、NSManagedObject或任何其他等价的对象。我只有values数组。
接下来,我想循环遍历这个数组,并读取左值和右值。为此,我想我必须投“有吗?”“SplitValue”,因为以下操作不起作用:
print(values.first!.left)
// error: value of type 'Any?' has no member 'left'
我也试过这样的方法,但显然也不管用:
print(values.first! as SplitValue<Any, Any>)
// error: type 'Any' does not conform to protocol 'Equatable'
所以问题是我不能投“任何”因为我不知道会是什么。解决这个问题的方法可能是什么,最好不必更改struct或values数组的定义?
最佳答案
您可以做的是创建一个没有泛型类型的协议,并让SplitValue
实现:
protocol AnySplitValue {
var l: Any? { get }
var r: Any? { get }
}
然后,遵循协议:
extension SplitValue: AnySplitValue {
var l: Any? {
return self.left
}
var r: Any? {
return self.right
}
}
现在,您可以执行此操作以打印出所有左侧值:
values.forEach { print(($0 as! AnySplitValue).l!) }
我们已经“抹掉”了一般类型!
关于ios - 如何转换“任何”?具有灵活的通用属性的结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49346075/