我正在使用一个第三方库,在我的用例中,它会给我下一个“[有吗?]'阵列。此数组包含可等式结构对象,定义如下:

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/

10-17 01:08