如何禁用 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 默认值: