Swift 4.1 に切り替えたばかりで、配列の型の適合性に問題があります。ここに古い方法があります:
public typealias XDRCodable = XDREncodable & XDRDecodable
public protocol XDREncodable: Encodable {
func xdrEncode(to encoder: XDREncoder) throws
}
public protocol XDRDecodable: Decodable {
init(fromBinary decoder: XDRDecoder) throws
init(fromBinary decoder: XDRDecoder, count: Int) throws
}
extension Array: XDRCodable {
public func xdrEncode(to encoder: XDREncoder) throws {
try encoder.encode(UInt32(self.count))
for element in self {
try (element as! Encodable).encode(to: encoder)
}
}
public init(fromBinary decoder: XDRDecoder) throws {
guard let binaryElement = Element.self as? Decodable.Type else {
throw XDRDecoder.Error.typeNotConformingToDecodable(Element.self)
}
let count = try decoder.decode(UInt32.self)
self.init()
self.reserveCapacity(Int(count))
for _ in 0 ..< count {
let decoded = try binaryElement.init(from: decoder)
self.append(decoded as! Element)
}
}
}
これにより、swift 4.1 で次のエラーが発生します。
「XDRDecodable」では、「Element」が「Decodable」に準拠する必要があります
そこで、宣言を次のように変更してみました。
extension Array: XDRCodable where Element : XDRCodable
これをコンパイルしても配列のエンコードに失敗し、次の警告が生成されます。
警告: Swift ランタイムは、条件適合性の動的クエリをまだサポートしていません ('Swift.Array': 'stellarsdk.XDREncodable')
これは進行中の作業であることがわかりましたが、型の適合性が適切に実装されるまで、これに対する回避策はありますか? 今のところSwift 4.0のように動作させたいと思います。