我定义了这样一个协议(protocol):
public protocol JSONConvertible {
typealias T
class func fromDictionary(dict: NSDictionary) -> T?
class func fromArray(arr: NSArray) -> Array<T>
}
fromDictionary 将字典转换为对象,例如 User,fromArray 将利用 fromDictionary 将 NSArray 转换为数组。
我想做的是提供一个 BasicObject,它为 fromArray 提供默认实现,比如:
public class BasicObject<T>: JSONConvertible {
public class func fromDictionary(dict: NSDictionary) -> T? {
return nil
}
public class func fromArray(arr: NSArray) -> Array<T> {
var result = Array<T>()
for obj in arr {
if let object: T = self.fromDictionary(obj as NSDictionary) {
result.append(object)
}
}
return result
}
}
然后 User 类将从 BasicObject 继承。
但是,当我像在 Java 中那样执行此操作时,它告诉我该类也必须是通用的:
public class User: BasicObject<User> {}
那么代码就变成了:
public class User<User>: BasicObject<User> {}
首先这看起来很奇怪,其次当我初始化一个对象时它会是:
var user = User<User>()
并且无法通过编译(错误:无法构造,因为它没有可访问的初始化器)。
那么我该怎么做才能达到我的目的呢?谢谢。
最佳答案
错误是因为我在测试用例中初始化它并且 init() 不是公开的。
Also User<User> can be anything like User<Int>()
类型别名解决方案如下:
typealias user = User<Int>
然后你可以初始化你的对象:
user()
However the User<Int> brings unnecessary <Int> and it looks really weird.
关于generics - swift 中的一般问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26880905/