Class 代表任意值。类型应该被隐藏,但类型应该是可比较的
Class representing any value. Type should be hidden but type should be comparable
我想构建一个类似于黑板的结构,其中值的类型被包装起来,以便 BlackboardValue
可以在不受其实际持有的类型限制的情况下传递。
其次,我需要检查两个 BlackboardValue
是否持有相同类型的值。
使用 BlackboardValue<T>
不会像看起来那样工作,因为 BlackboardValue<String>
不能与 BlackboardValue<Double>
和其他问题一起存储。 BlackboardValue
应该是单一类型。
我认为问题可以归结为我似乎无法检查两个 Wrapper 是否具有相同类型:
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
我找到了一种方法。试试这个方法。
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
我想构建一个类似于黑板的结构,其中值的类型被包装起来,以便 BlackboardValue
可以在不受其实际持有的类型限制的情况下传递。
其次,我需要检查两个 BlackboardValue
是否持有相同类型的值。
使用 BlackboardValue<T>
不会像看起来那样工作,因为 BlackboardValue<String>
不能与 BlackboardValue<Double>
和其他问题一起存储。 BlackboardValue
应该是单一类型。
我认为问题可以归结为我似乎无法检查两个 Wrapper 是否具有相同类型:
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
我找到了一种方法。试试这个方法。
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