0
protocol Decodable {
    init?(data: [String: AnyObject])
}

struct A: Decodable {

    var data: [String: AnyObject]!

    init?(data: [String: AnyObject]) {
        self.data = data
    }

}

これは、オブジェクトを作成したいときに機能します

let d = ["name":"Rahul"]
let a = A(data: d)

以下を達成しようとしていますが、コンパイル時にエラーが発生しています。

let dArray = [["name":"Rahul"],["name":"Rahul"],["name":"Rahul"]]
let aArray = [A](data: dArray)

次のコードは、「イニシャライザで許可される唯一の戻り値は nil です」というエラーを表示しています。

public extension CollectionType where Generator.Element: Decodable {

    init?(data: [[String: AnyObject]]) {
        var elements: [Generator.Element] = []

        for d in data {
            let element = Generator.Element(data: d)
            if let element = element {
                element.append(element)
            }
        }

        return elements

    }

}

================================= 答え: -

public extension Array where Element: Decodable {

    init?(data: [String: AnyObject]) {
        var elements: [Element] = []
        for d in data {
            let element = Element(data: d)
            if let element = element {
                element.append(element)
            }
        }
        self = elements
    }

}

これにより、次のコードを使用して初期化できます

let dArray = [["name":"Rahul"],["name":"Rahul"],["name":"Rahul"]]
let aArray = [A](data: dArray)
4

2 に答える 2

0

あなたのエラーは、CollectionType初期化できないプロトコルであるためです。コレクションを返すヘルパー クラス メソッドを作成しようとしましたか。

func collectionWithData(data: [[String: AnyObject]]) -> [Generator.Element] {
于 2016-02-13T10:57:45.277 に答える
0

プロトコルを定義しましょう

protocol P {
    init?(b: Bool)
}

Oliver が述べたように、プロトコルは初期化できませんが、プロトコル拡張で init を定義することはできます

extension P {
    init?(b: Bool) {
        print("init defined in extension")
        if b == false { return nil }
        self.init(b: b)
    }
}

init からは nil 以外は何も返せないことを確認してください (初期化が失敗した場合)

プロトコルに準拠するクラスを定義しましょう

class C: P {
    var b: Bool
    required init(b: Bool) {
        self.b = b
    }
}

次のスニペットで何が起こるか見てみましょう

let c1: C? = C(b: false)
let c2 = C(b: false)
dump(c1)
dump(c2)
/*
init defined in extension
- nil
▿ C #0
  - b: false
*/

同じ式でC(b: false)も 2 つの異なる結果が得られます :-)。では、init と init を定義する場合は注意が必要ですか? プロトコル拡張経由。init と init を定義しようとすると?プロトコル拡張なしで同じパラメーターを使用すると、コンパイラーは文句を言います。

于 2016-02-13T11:39:54.520 に答える