swift - 关于在 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!"))
}
}
推荐阅读
- java - Spring boot 使用 MySQL(Master/Slave) 配置多数据源
- html - 放大导致页脚不增长
- javascript - 如何修复 Javascript 中的“无效密文大小”错误?(aes)
- c# - Linq返回下一行有值的当前行
- node.js - NPM CI 和 Bluebird 承诺警告
- excel - 循环多次执行相同的代码
- php - Laravel 5.7 资源路径未定义
- vue.js - Vuex:状态管理。从状态或服务器获取数据哪个更好?
- assertj - AssertJ + 验证 subList 中返回的项目包含字符串,该字符串将出现在任何列表项目中
- java - Jasper 使用 Java 中的 jsonql 数据源填充报告