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

1

如果你可以设置你的班级final,你可以用Self班级名称替换

final class SampleClass: DatabaseInjectable {
    init() {
    }
    static func deriveObjectFromDBRow(row: [String]) -> SampleClass? {
        return SampleClass()
    }

    static func collectAllObjectsForDatabaseAction(action: (Database) -> Void) -> [SampleClass]? {
        let array = [SampleClass]()
        return array
    }
}
于 2016-01-22T09:19:09.047 回答
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

您可以typealias在您的协议中使用 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] */

然而,这里的一个缺点是,您可以设置 eg typealias MySelf = Int(在类中)并让您的函数返回一个整数/整数数组(而不是 self/[Self]),并且仍然符合您的协议。这可能是一个交易破坏者。

于 2016-01-22T10:50:37.167 回答