2016-01-22 59 views
1

我有一个协议实现如下。如何从Swift协议中返回`[Self]`?

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(它自己的类)会很好。

+1

尽管我自己回答了几个*类似的问题(其中没有一个我认为回答你的*特定的问题),但我仍然发现了对'自我'的直觉的处理。也许有人可以写一个明确的指南... – Grimxn

回答

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 
    } 
} 
+0

它可能是一个解决方案,但我需要继承它。因此我不能将它设置为˚Final˚类。 – Goppinath

+0

很高兴知道,thx男人,它帮助了我。 – tony508

0

有一个写得很好的答案here,但总之,你可以定义你的协议,因为这样:


protocol DatabaseInjectable { 

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

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

谢谢,但我需要特定的类类型作为返回类型。与Objective-C中的'instancetype'相同 – Goppinath

0

您可以在协议DatabaseInjectable中使用typealias,并将其用作符合协议的类中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] */ 

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