我有一个泛型类,我希望能够与默认类型一起使用.现在我可以用任何类型初始化它,但我必须是显式的.

//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-Can无法在AudioKit中找出简单的麦克风效果-文件链

从`compactMap()`闭包返回`nil`未通过结果类型判断

Swift 扩展:通过方法重载增强现有类

是否可以使用一个 NSRegularExpression 同时判断字符串格式并提取子字符串?

如何使 onKeyPress 与 TextField 快速配合使用?

如何判断设备是否为 Vision Pro - Xcode 15 Beta 4

有没有办法让文本字段以不同的 colored颜色 显示而不影响半透明背景?

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

并发执行代码中捕获的 var 的变异

`@available` 属性在 macOS 版本上被错误地限制

符合协议要求委托变量在 ios13 中可用

Swift 2.0 方法不能标记为@objc,因为参数的类型不能在 Objective-C 中表示

swift中的SequenceType和CollectionType有什么区别?

如何在 Xcode 中的 UITests 下以通用方式访问后退栏按钮项?

'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序

在 Swift for iOS 中沿圆形路径绘制文本

Swift:如何从函数返回类类型

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

无法推断泛型参数的参数