0

在下面的代码中:

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]
}

(所有者 var 定义为[Serializable]

case let value as Array<Serializable>:会识别它,但以防万一:

struct Car: Serializable {
   var owners: [Owner]
}

(所有者 var 定义为[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]

4

2 回答 2

0

Array<T>并且T是不同的类型,所以你不能指望一个人对协议的遵守会对另一个人产生任何影响。

关于你的例子:

extension Array where Element: Serializable {
   var representation: AnyObject {
      return self.map { element in return "String" }
   }
}

在这里,您正在检查每个元素( Element) 的一致性,而不是 Array 作为它自己的类型。Element是一个单独的类型,而不是Array<Element>.

如果没有更多信息,很难知道您应该在这里做什么,但我希望我已经回答了为什么您没有得到预期的结果。

于 2016-07-28T00:05:47.223 回答
0

在 Swift 中,协议具有与具体类型不同且独立的内存表示。所以简短的回答是Serializable内存中的数组不同于符合 的类型的数组Serializable,并且 Swift 目前没有在两者之间进行转换的机制。

本次 WWDC 演讲中更具体的细节:

https://developer.apple.com/videos/play/wwdc2016/416/

于 2016-07-28T00:10:07.390 回答