如何禁用 Optional 的默认 nil 初始化
How to disable default nil-initialization of Optional
假设我有这两个结构:
struct DataOne {
let id: String
// ...
}
struct DataTwo {
let id: String
// ...
}
并且有单独的转换函数:
extension DataOne {
func convertToDataTwo() -> DataTwo {
.init(
id: self.id,
// ...
)
}
}
在某些时候,var name: String?
字段被添加到两个结构中:
struct DataOne {
let id: String
var name: String?
// ...
}
struct DataTwo {
let id: String
var name: String?
// ...
}
但集会不宣誓,因为该字段是可选的。
并且在转换时, name
字段丢失。
是否可以禁用选项的自动填充或调用警告?
我试图在SwiftLint中找到这样的规则,但没有找到。
如果你的 var
的类型写成 T?
没有默认值,并且 Swift 为你的类型合成一个成员init
,那么合成的 init
使用默认值 nil
作为 var
.
但是,如果您的 var
的类型写成 Optional<T>
并且没有默认值,那么合成的 init
不会 使用默认值。
所以改为这样写:
struct DataOne {
let id: String
var name: Optional<String>
// ...
}
struct DataTwo {
let id: String
var name: Optional<String>
// ...
}
或者写出你的 init
而不是让编译器合成它:
struct DataOne {
let id: String
var name: String?
init(id: String, name: String?) {
self.id = id
self.name = name
}
}
struct DataTwo {
let id: String
var name: String?
init(id: String, name: String?) {
self.id = id
self.name = name
}
}
您可以使用 Xcode 的编辑器 > 重构 > 生成成员初始化器命令为您编写大部分 init
,然后删除 = nil
默认值:
假设我有这两个结构:
struct DataOne {
let id: String
// ...
}
struct DataTwo {
let id: String
// ...
}
并且有单独的转换函数:
extension DataOne {
func convertToDataTwo() -> DataTwo {
.init(
id: self.id,
// ...
)
}
}
在某些时候,var name: String?
字段被添加到两个结构中:
struct DataOne {
let id: String
var name: String?
// ...
}
struct DataTwo {
let id: String
var name: String?
// ...
}
但集会不宣誓,因为该字段是可选的。
并且在转换时, name
字段丢失。
是否可以禁用选项的自动填充或调用警告?
我试图在SwiftLint中找到这样的规则,但没有找到。
如果你的 var
的类型写成 T?
没有默认值,并且 Swift 为你的类型合成一个成员init
,那么合成的 init
使用默认值 nil
作为 var
.
但是,如果您的 var
的类型写成 Optional<T>
并且没有默认值,那么合成的 init
不会 使用默认值。
所以改为这样写:
struct DataOne {
let id: String
var name: Optional<String>
// ...
}
struct DataTwo {
let id: String
var name: Optional<String>
// ...
}
或者写出你的 init
而不是让编译器合成它:
struct DataOne {
let id: String
var name: String?
init(id: String, name: String?) {
self.id = id
self.name = name
}
}
struct DataTwo {
let id: String
var name: String?
init(id: String, name: String?) {
self.id = id
self.name = name
}
}
您可以使用 Xcode 的编辑器 > 重构 > 生成成员初始化器命令为您编写大部分 init
,然后删除 = nil
默认值: