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

(所有者変数は次のように定義されます[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

[Owner]が動作するので、Swift はそれが[Serializable]であることを認識しcase let value as Array<Serializable>ます。[Serializable][Owner]

4

2 に答える 2

0

Swift では、プロトコルは具象型とは異なり、別個のメモリ表現を持ちます。したがって、簡単な答えは、 の配列は、Serializableに準拠する型の配列とはメモリ内で異なり、SerializableSwift には現在、2 つの間でキャストするメカニズムがありません。

この WWDC トークのより具体的で核心的な詳細:

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

于 2016-07-28T00:10:07.390 に答える