在过去的这些日子里,我一直在做一个强烈的 - 但基本上是基本的 - 对结构的研究,其中一个我无法理解的事情是为什么人们会在初始化器中将参数命名为与原始名称不同。
我知道这是可能的,它是允许的,但在实践中,我总是看到阴影。
例如:
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
}
一个真正的实际原因?
我能看到的唯一一个就是放弃self
,在Swift编码时已经有99%的时间已经完成了。在我的所有答案中,只要有可能,我真的很喜欢使用阴影。你可以在这篇文章Swift Array instance method drop(at: Int)上看到它,其中一个本地var index
shadowing收集方法index<T: Comparable>(_ T, offsetBy: T, limitedBy: T)
。
或者在这个帖子Swift: second occurrence with indexOf一个经典的阴影例子
var startIndex = self.startIndex
您可以在其中引用startIndex
局部方法变量或集合的实例属性添加自前缀self.startIndex
。