代表任何价值的类。应隐藏类型,但类型应具有可比性

时间:2015-01-31 14:57:44

标签: generics swift

我想构建一个类似于黑板的结构,其中包含值的类型,以便BlackboardValue可以传递而不受其实际持有的类型的限制。

其次,我需要检查两个BlackboardValue是否包含相同类型的值。 由于BlackboardValue<T>无法与BlackboardValue<String>一起存储以及其他问题,因此BlackboardValue<Double>似乎无法正常工作。 BlackboardValue应该是单一类型。

我认为问题可以归结为我似乎无法检查两个Wrappers是否保持相同的类型:

import Foundation

class Wrapper {
    var value: Any?

    init(v: Any) {
        self.value = v
    }
}

func wrappersHoldTheSameValueType(w1: Wrapper, w2: Wrapper) -> Bool {
    return false
}

var w = Wrapper(v: "Hans")
var d = w.value as String

1 个答案:

答案 0 :(得分:1)

我找到了办法。试试这种方式。

func wrappersHoldTheSameValueType(w1: Wrapper, w2: Wrapper) -> Bool {
    let typeidof = { (a: Any) in
        unsafeBitCast(reflect(a).valueType, uintptr_t.self)
    }
    switch ((w1.value, w2.value)) {
        case let (.Some(a), .Some(b)):
            return typeidof(a) == typeidof(b)
        case (nil, nil):
            return true
        default:
            return false
    }
}

有点尴尬,但至少现在似乎有用。

wrappersHoldTheSameValueType(Wrapper(v:1), Wrapper(v:2))         // ==> true
wrappersHoldTheSameValueType(Wrapper(v:"a"), Wrapper(v:"b"))     // ==> true
wrappersHoldTheSameValueType(Wrapper(v:["a"]), Wrapper(v:["b"])) // ==> true
wrappersHoldTheSameValueType(Wrapper(v:UIView()), Wrapper(v:1))  // ==> false
wrappersHoldTheSameValueType(Wrapper(v:[1]), Wrapper(v:["a"]))   // ==> false
相关问题