如何从Swift协议中返回`[Self]`?
问题描述:
我有一个协议实现如下。如何从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
(它自己的类)会很好。
答
如果你可以设置你的类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
}
}
答
有一个写得很好的答案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
答
您可以在协议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]),并且仍然符合你的协议。可能这是一个破坏交易的行为。
尽管我自己回答了几个*类似的问题(其中没有一个我认为回答你的*特定的问题),但我仍然发现了对'自我'的直觉的处理。也许有人可以写一个明确的指南... – Grimxn