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

Struct (Swift 4.x+)结构初始化器中命名参数的规则是什么?,struct,parameters,swift4,naming-conventions,initializer,Struct,Parameters,Swift4,Naming Conventions,Initializer,在过去的几天里,我一直在对结构进行深入的研究,但显然是基础性的研究。我不明白的一件事是,为什么人们会在初始值设定项中对参数的命名与其原始名称不同 我知道这是可能的,这是允许的,但在实践中,我总是看到阴影 例如: struct Person { var name: String var age: Int init(firstName: String, ancientness: Int) { self.name = firstName sel

在过去的几天里,我一直在对结构进行深入的研究,但显然是基础性的研究。我不明白的一件事是,为什么人们会在初始值设定项中对参数的命名与其原始名称不同

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

例如:

struct Person {
    var name: String
    var age: Int

    init(firstName: String, ancientness: Int) {
        self.name = firstName
        self.age = ancientness
    }
}
除了发明愚蠢的名字会带来荒谬的乐趣之外,还有什么真正实际的理由可以让人做出这样的事情呢


谢谢

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

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
}
一个真正实际的理由

我能看到的唯一一件事就是放弃自我,当用Swift编码时,99%的时间都可以做到。事实上,我非常喜欢在所有答案中尽可能使用阴影。您可以在这篇文章中看到它,其中一个本地var索引隐藏了收集方法索引ut,offsetBy:T,limitedBy:T

或者在这篇文章里有一个经典的阴影例子

var startIndex = self.startIndex

您可以在其中引用startIndex本地方法变量或集合的实例属性,添加self前缀self.startIndex。

@LeoDabus谢谢!我遵循的教程有很多这样的变化。当我问作者为什么会这样时,他简单地回答说“代码充满了变化”。尽管如此,我还是感到很困惑。如果有更详细的解释,请指出。@LeoDabus非常感谢,这更清楚了@是的,谢谢!