2

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のように動作させたいと思います。

4

1 に答える 1