首页 > 解决方案 > 关于在 Swift 中使用泛型类型扩展 Optional 的问题

问题描述

我试图为安全解包做一个扩展,我正在使用它的 2 个版本,一个长代码形式,第二个短代码!但没想到他们不工作!就我所看到的代码而言,我只是让所有事情都正确!我缺少什么来修复两个版本?

struct ContentView: View {
    
    let test: String? = "Hello, World!"
    
    var body: some View {
        Text(test.safeUnwrapV1(defaultValue: "Empty!"))
        Text(test.safeUnwrapV2(defaultValue: "Empty!"))
    }
    
}


extension Optional {    
    func safeUnwrapV1<T>(defaultValue: T) -> T {
        let wrappedValue: T? = (self as? T?) ?? nil
        if let unwrappedValue: T = wrappedValue { return unwrappedValue }
        else { return defaultValue }
    }
    
    func safeUnwrapV2<T>(defaultValue: T) -> T {
        return (self as? T) ?? defaultValue
    }
    
}

标签: swiftswiftuioptional

解决方案


无需定义自己的泛型类型参数。Optional已经是泛型的并且它的泛型类型参数被调用Wrapped。所以你只需要将默认值的类型声明为Wrapped.

extension Optional {
    func defaultValue(_ value: Wrapped) -> Wrapped {
        self ?? value
    }
}

struct ContentView: View {

    let test: String? = "Hello, World!"

    var body: some View {
        Text(test.defaultValue("Empty!"))
    }
}

推荐阅读