1

私は次のようにプロトコルを実装しています。

protocol DatabaseInjectable {

    static func deriveObjectFromDBRow(row: [String]) -> Self? // Method - 1

    static func collectAllObjectsForDatabaseAction(action: (Database) -> Void) -> [Self]? // Method - 2
}

私はMethod - 1このような対応する実装で成功しています:

static func deriveObjectFromDBRow(row: [String]) -> Self? {

    ...
}

しかし、私はこのように実装できませんでしたMethod - 2:

static func collectAllObjectsForDatabaseAction(action: (WWDatabase) -> Void) -> [Self]? {

    ...
}

そこで、次のようなエラーが発生します。

'Self' is only available in a protocol or as the result of a method in a class;

(それ自体のクラス)の配列形式 を返すための助けがあればいいでしょう。Self

4

3 に答える 3

0

ここに非常によく書かれた回答がありますが、要するに、プロトコルを次のように定義できます。


protocol DatabaseInjectable {

    static func deriveObjectFromDBRow(row: [String]) -> DatabaseInjectable? // Method - 1

    static func collectAllObjectsForDatabaseAction(action: (Database) -> Void) -> [DatabaseInjectable]? // Method - 2
}
于 2016-01-22T09:30:22.193 に答える
0

typealiasprotocolで a を使用し、DatabaseInjectableこれをエイリアスとして使用してSelf、プロトコルに準拠するクラスを入力できます。

class Database {
    var desc : String = "Default"
}

protocol DatabaseInjectable {
    typealias MySelf

    static func deriveObjectFromDBRow(row: [String]) -> MySelf?

    static func collectAllObjectsForDatabaseAction(action: (Database) -> Void) -> [MySelf]?
}

class MyClass : DatabaseInjectable {
    typealias MySelf = MyClass

    static func deriveObjectFromDBRow(row: [String]) -> MySelf? {
        return MyClass()
    }

    static func collectAllObjectsForDatabaseAction(action: (Database) -> Void) -> [MySelf]? {
        return [MyClass(), MyClass()]
    }
}

/* example */
let closure : (Database) -> () = { print($0.desc) }
var arr : [MyClass]? = MyClass.collectAllObjectsForDatabaseAction(closure)
/* [MyClass, MyClass] */

ただし、ここでの欠点の 1 つは、eg typealias MySelf = Int(クラス内) を設定して、関数に (self/[Self] ではなく) 整数/整数の配列を返させ、それでもプロトコルに準拠させることができることです。おそらくこれは契約違反です。

于 2016-01-22T10:50:37.167 に答える