关于在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
}

}

不需要定义自己的泛型类型参数。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!"))
}
}
extension Optional {
func safeUnwrap(_ defaultValue: Wrapped) -> Wrapped {
switch self {
case let value?: return value
case nil: return defaultValue
}
}
}

或者

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

但是正如所指出的,这比仅仅使用??操作符更啰嗦,更不习惯。

让你的扩展像这样。

extension Optional {

func safeUnwrapV1<T>(defaultValue: T) -> Wrapped {

guard let value = self else {
return defaultValue as! Wrapped
}
return value
}
}

编辑:正如@Rudedog建议的那样,没有必要在这里定义泛型

extension Optional {
func safeUnwrapV1(defaultValue: Wrapped) -> Wrapped {

guard let value = self else {
return defaultValue
}
return value
}
}

我会将OptionalgenericWrappedtype约束为LosslessStringConvertible:


extension LosslessStringConvertible {
var string: String { .init(self) }
}

extension Optional where Wrapped: LosslessStringConvertible {
var string: String { self?.string ?? "" }
func string(default value: Wrapped) -> String {
self?.string ?? value.string
}
}

用法:

var double1 = Double("2.7")
var double2 = Double("a")
print(double1.string(default: 0))
print(double2.string(default: 0))

这将打印:

2.7
0

最新更新