(Swift 4.x +)在结构的初始值设定项中命名参数的规则是什么?

时间:2019-02-13 07:47:25

标签: struct parameters swift4 naming-conventions initializer

在最近的几天里,我一直在对结构进行深入而又深入的研究,而我无法理解的一件事是,为什么有人会在初始化器中命名参数而不是使用其原始名称。

我知道这是可能的,但允许,但实际上,我总是看到 shadowing

例如:

struct Person {
    var name: String
    var age: Int

    init(firstName: String, ancientness: Int) {
        self.name = firstName
        self.age = ancientness
    }
}

除了荒谬的发明人发明愚蠢的名字之外,还有没有真正实际的理由来做这样的事情?

谢谢

1 个答案:

答案 0 :(得分:1)

简短的回答是“否”。长答案是在创建自定义结构时,您甚至不必提供自定义初始化程序。该结构将为您提供。与您的问题无关,但您应始终将属性声明为常量。如果需要其他值,请使用从旧实例更新的值创建一个新结构。只需创建一个“普通”结构:

struct Person {
    let name: String
    let age: Int 
} 

这将为默认初始化器提供以下签名:

Person.init(name: String, age: Int)

如果您要为该结构提供相同的初始化程序,则将其写为:

init(name: String, age: Int) { 
    self.name = name
    self.age = age 
}

最后的想法

没有理由这样做。您应该使初始化程序的名称与将分配给它们的属性的名称匹配。选择其他名称的唯一“好处”是不必在初始化程序内显式调用self

在您的示例中就足够了

init(firstName: String, ancientness: Int) {
    name = firstName
    age = ancientness
}

但不是我的

init(name: String, age: Int) {
    name = name  // Cannot assign to value: 'name' is a 'let' constant
    age = age    // Cannot assign to value: 'name' is a 'let' constant
}

真正可行的原因吗?

我唯一能看到的就是丢弃self,在Swift中进行编码时,已经可以完成99%的时间了。实际上,我很喜欢在所有答案中都尽可能使用阴影。您可以在此帖子Swift Array instance method drop(at: Int)上看到它,其中本地变量index隐藏了收集方法index<T: Comparable>(_ T, offsetBy: T, limitedBy: T)

或者在此帖子Swift: second occurrence with indexOf上有一个经典的阴影示例

var startIndex = self.startIndex

您可以在其中引用startIndex本地方法变量或在集合的instance属性中添加自身前缀self.startIndex