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非常感谢,这更清楚了@是的,谢谢!