有些事让我很烦恼。 这是我在Playground得到的:
protocol BaseProtocol{}
extension Dictionary : BaseProtocol{}
extension String : BaseProtocol{}
let A : [String:BaseProtocol?] = [
"A" : "ABC",
"B" : nil ,
"C" : "C1"
]
//Direct Cast
let D = A as? [String:String?] //OK
//'Indirect' Cast
let B : BaseProtocol = A
let C = B as? [String:String?] //Fail -> C == nil
//Two Steps Cast
let E = B as? [String:BaseProtocol?]
let F = E as? [String:String?] //OK
所以,这是我的问题。存储在B中的值是有效的[String:String?]值。为什么转换为变量C会失败?
这是该语言的理想行为吗?或者它正在开发中的东西'?
更具体我的情况。我扩展了Dictionary和Array,我知道我有一个BaseProtocol值(比如变量B),需要将它转换为Element(Array)或Value(Dictionary)并附加它。 但是,即使该值实际上对于变量C实例化显示有效,该演员也会失败。
非常感谢任何帮助或见解。
编辑:"泛型"这种情况是在Playground中使用的词典