Swift:减少 Init 方法的长度

标签 swift swift2 ios9

我想减少 init 方法的长度。

struct Person {

    var id: Int
    var firstName: String
    var lastName: String
    var vehicle: String
    var location: String
    var timeZone: String

    init (id: Int, firstName: String, lastName: String, vehicle: String, location: String, timeZone: String ) {
        self.firstName = firstName
        self.lastName = lastName
        self.vehicle = vehicle
        self.location = location
        self.timeZone = timeZone
    }
}

下面是我正在创建的 Person 实例。我必须传入每个内联变量的值。

let person = Person(id: 22, firstName: "John", lastName: "Doe", vehicle: "Chevy", location: "Dallas", timeZone: "CST")

问题:如何缩短 init? 的长度 在 Obj-C 中,我曾经创建一个数据模型类。填充它的变量然后传递整个类,减少 init 方法的长度。

Person *person = [Person new];
person.id = 22;
person.firstName = "John";
person.lastName = "Doe";
person.vehicle = "Chevy";
person.location = "Dallas";
person.timeZone = "CST"

Person *person = [Person initWithPerson:person];

在 Swift 中有什么等效的方法可以减少 init 的长度,而不必初始化每个内联变量?我知道元组是一种方式,还有其他最佳做法吗?

最佳答案

只需删除初始化程序!

struct Person {
    let id: Int
    let firstName: String
    let lastName: String
    let vehicle: String
    let location: String
    let timeZone: String
}

现在你可以使用memberwise initializer

Person(
    id: 87112,
    firstName: "Walter",
    lastName: "White",
    vehicle: "2004 Pontiac Aztek",
    location: "Albuquerque",
    timeZone: "UTC-07:00"
)

Structure types automatically receive a memberwise initializer if they do not define any of their own custom initialisers.

The Swift Programming Language

不要使用变量

如您所见,我将 var 替换为 let。 除非您需要在创建值后更改 Person 的某些属性,否则我建议您使用 let。否则,您可以自由使用 var。这样编译器将防止不必要的更改。

不要使用可选值

我不知道您的应用程序的业务逻辑,但是如果一个人必须始终填充所有 6 个属性,请不要将它们设为可选。否则,每次您需要使用 Person 值时,编译器都会强制您检查该可选值是否有值。

不要使用隐式解包选项

说真的。在少数情况下它们很有用,而模型值不是其中之一

关于Swift:减少 Init 方法的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278523/

相关文章:

ios - 什么时候LAContext :evaluatePolicy result in LAError. AppCancel?

swift - 我们如何在 cocoa Mac OSX 应用程序中使用 NSWorkSpace 添加附件到默认邮件应用程序

ios - 如何在 swift (SpriteKit) 中绘制作为单个节点的圆点

swift - scrollViewDidScroll 用奇怪的 contentOffsetY 调用

swift - 关于Swift 2中NSURLSession(请求数据)的几个问题

ios - 从服务器加载的 CollectionView/TableView 中的图像存在问题,不会立即加载到每个单元格中

swift - 根据值设置 TabBarController 索引的 View Controller

ios - 预期返回“UIFont?”的函数中缺少返回

未调用 iOS9 Safari 内容拦截器扩展

java - 无法使用代号一下的 iOS 9.x 设备连接到 HTTP URL