在最近的几天里,我一直在对结构进行深入而又深入的研究,而我无法理解的一件事是,为什么有人会在初始化器中命名参数而不是使用其原始名称。
我知道这是可能的,但允许,但实际上,我总是看到 shadowing 。
例如:
struct Person {
var name: String
var age: Int
init(firstName: String, ancientness: Int) {
self.name = firstName
self.age = ancientness
}
}
除了荒谬的发明人发明愚蠢的名字之外,还有没有真正实际的理由来做这样的事情?
谢谢
答案 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
。