【发布时间】:2016-07-27 20:43:39
【问题描述】:
在下面的代码中:
protocol Serializable {
}
struct Owner: Serializable {
var name: String
}
struct Car: Serializable {
var owners: [Serializable]
}
let car = Car(owners: [Owner(name: "John"), Owner(name: "Mike")])
Mirror(reflecting: car).children.forEach {
switch $0.value {
case let value as Array<Serializable>:
print("Recognized!")
default: break
}
}
如果在
struct Car: Serializable {
var owners: [Serializable]
}
(所有者变量定义为[Serializable])
case let value as Array<Serializable>: 会识别它,但以防万一:
struct Car: Serializable {
var owners: [Owner]
}
(所有者变量定义为[Owner])
case let value as Array<Serializable>: 不会识别它,虽然Owner 符合Serializable 协议?
谁能解释一下原因?
我试过了:
extension Array where Element: Serializable {
var representation: AnyObject {
return self.map { element in return "String" }
}
}
let arr: [Owner] = [Owner(name: "John"), Owner(name: "Mike")]
arr.representation
有效,所以 Swift 识别出 [Owner] 是 [Serializable],为什么 case let value as Array<Serializable> 匹配 [Serializable] 而不是 [Owner]?
【问题讨论】:
-
你试过
case let value where value is Array<Serializable>吗? -
它不起作用。工作原理与
case let value as Array<Serializable> -
有人删除了回复。他提到这不会编译: let arr: [Owner] = [Owner(name: "John"), Owner(name: "Mike")];让 arr2 = arr 为? Array
... 错误:Serializable 不是 Owner 的子类型。