ぜのぜ

しりとりしようぜのぜのぜのぜ

126日目

日記

相変わらず米を炊いていない.

今日書いたコードと感想

こういう場合でも複数のextensionで同じプロトコルに準拠することはできない.

protocol Serializable {
    func serialize() -> Any
}

extension Array: Serializable where Element == Int {
    func serialize() -> Any {}
}
// Conflicting conformance of 'Array<Element>' to protocol 'Serializable'; there cannot be more than one conformance, even with different conditional bounds
extension Array: Serializable where Element == String {
    func serialize() -> Any {}
}

その場合は次のようにしろと書いてあった.

protocol SerializableInArray {}
extension Int: SerializableInArray {}
extension String: SerializableInArray {}

extension Array: Serializable where Element: SerializableInArray {
    func serialize() -> Any {}
}

こうするとたしかにArray<Int>Array<String>インスタンスに対してのみserialize()を呼べるようになるが,Array<Int>Array<String>serialize()の実装だけを書くということもしたかったはずで,それはどうすればいいんですか.

print([1, 2, 3].serialize())
print(["a", "b", "c"].serialize())
print([1.0, 2.0, 3.0].serialize()) // Referencing instance method 'serialize()' on 'Array' requires that 'Double' conform to 'SerializableInArray'