作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个泛型类,我希望它能够与默认类型一起使用。现在我可以用任何类型初始化它,但我必须明确。
//Initialize with a type
MyManager<MyCustomerObject>()
// Initialize with NSObject (what I want to be my default type)
MyManager<NSObject>()
// This doesn't work, but I want this kind of functionality
class MyManager<T = NSObject> {}
// So I can create my manager like so and it inserts the default type as NSObject
MyManager() //Or MyManager<>()
这在 Swift 中可能吗?
最佳答案
不支持默认的通用参数,但您可以通过定义默认的 init()
来伪装它在类型受限的扩展上,在这种情况下,编译器将足够聪明地使用该类型。例如:
class MyManager<T> {
let instance: T
init(instance: T) {
self.instance = instance
}
}
extension MyManager where T == NSObject {
convenience init() {
self.init(instance: NSObject())
}
}
现在你可以不带参数初始化类型,它默认为MyManager<NSObject>
:
let mm1 = MyManager(instance: "Foo") // MyManager<String>
let mm2 = MyManager(instance: 1) // MyManager<Int>
let mm3 = MyManager() // MyManager<NSObject>
SwiftUI 大量使用了这种技术。
关于swift - 我可以在 Swift 中将默认类型分配给泛型类型 T 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015081/
我是一名优秀的程序员,十分优秀!