9

私はこのようなことをしたいのですが、正しい構文を取得したり、それを書くための正しい方法を提供するWeb上の場所を見つけることができません:

protocol JSONDecodeable {
    static func withJSON(json: NSDictionary) -> Self?
}

protocol JSONCollectionElement: JSONDecodeable {
    static var key: String { get }
}

extension Array: JSONDecodeable where Element: JSONCollectionElement {
    static func withJSON(json: NSDictionary) -> Array? {
        var array: [Element]?
        if let elementJSON = json[Element.key] as? [NSDictionary] {
            array = [Element]()
            for dict in elementJSON {
                if let element = Element.withJSON(dict) {
                    array?.append(element)
                }
            }
        }
        return array
    }
}

したがって、この配列の要素が に準拠している場合にのみArray、プロトコルに準拠したいと考えています。JSONDecodeableJSONCollectionElement

これは可能ですか?もしそうなら、構文は何ですか?

4

4 に答える 4

5

これは Swift ではまだできません。標準ライブラリでも同じことが起こっていることがわかります:要素で宣言されている場合は適合Arrayしません。EquatableEquatable

于 2015-10-19T18:19:46.927 に答える
1

スウィフト 4.2

Swift 4.2 では、次のようなプロトコルに準拠する要素で配列を拡張できました。

public extension Array where Element: CustomStringConvertible{
    public var customDescription: String{
        var description = ""
        for element in self{
            description += element.description + "\n"
        }

        return description
    }
}
于 2018-10-21T18:15:52.890 に答える
0

これが最善のアプローチなのか、アップルがこの方法で使用することを意図していたのかはわかりません。私はこれを一度使用しましたが、うまくいきました:

次のプロトコルがあるとします

protocol MyProtocol {
    var test: Bool { get }
}

配列に対してこれを行うことができます

extension Array: MyProtocol where Element: MyProtocol {
    var test: Bool {
        return self.allSatisfy({ $0.test })
    }
}

そして、これは辞書用です

extension Dictionary: MyProtocol where Value: MyProtocol {
    var test: Bool {
        return self.values.allSatisfy({ $0.test })
    }
}
于 2018-12-01T17:47:18.090 に答える