(Swift 4.x+) 在结构体的初始化器中命名参数的规则是什么?

(Swift 4.x+) What are the rules for naming parameters in structs’ initializers?

在过去的几天里,我一直在对结构进行深入的——但显然是基础的——研究,我无法理解的一件事是为什么有人会在初始化程序中以不同于其原始名称的方式命名参数。

我知道这是可能的,这是允许的,但在实践中,我总是看到 阴影

例如:

struct Person {
    var name: String
    var age: Int

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

除了发明愚蠢的名字所带来的荒谬乐趣之外,是否有一个真正实际的理由可以解释为什么人们会做出这样的事情?

谢谢

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

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 
}

最后的想法

没有理由做这样的事情。你应该让你的初始化器名称与它们将被分配到的属性的名称相匹配。选择不同名称的唯一 "advantage" 是不必在初始化程序中显式调用 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% 的时间。实际上,我非常喜欢在所有答案中尽可能使用阴影。您可以在 post Swift Array instance method drop(at: Int) 中看到它,其中局部变量 index 隐藏了收集方法 index<T: Comparable>(_ T, offsetBy: T, limitedBy: T)

或者在这个 post 一个经典的阴影示例

var startIndex = self.startIndex

你可以参考 startIndex 本地方法变量或集合的实例 属性 添加自身前缀 self.startIndex.