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

问题描述 投票:0回答:1

在过去的这些日子里,我一直在做一个强烈的 - 但基本上是基本的 - 对结构的研究,其中一个我无法理解的事情是为什么人们会在初始化器中将参数命名为与原始名称不同。

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

例如:

struct Person {
    var name: String
    var age: Int

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

除了发明愚蠢名字的荒谬乐趣之外,还有一个真正的实际原因,为什么人们会做这样的事情?

谢谢

struct parameters swift4 naming-conventions initializer
1个回答
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)上看到它,其中一个本地var indexshadowing收集方法index<T: Comparable>(_ T, offsetBy: T, limitedBy: T)

或者在这个帖子Swift: second occurrence with indexOf一个经典的阴影例子

var startIndex = self.startIndex

您可以在其中引用startIndex局部方法变量或集合的实例属性添加自前缀self.startIndex

© www.soinside.com 2019 - 2024. All rights reserved.