(Swift 4.x +) Каковы правила именования параметров в инициализаторах структур? - PullRequest
0 голосов
/ 13 февраля 2019

В эти последние дни я проводил интенсивное, но, по-видимому, базовое исследование структур, и одна из вещей, которые я не могу понять, - это то, почему в инициализаторе можно было бы назвать параметры иначе, чем их первоначальное имя.

Я знаю, что это возможно, что это разрешено, но на практике я всегда видел вместо этого тени .

Например:

struct Person {
    var name: String
    var age: Int

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

Помимо абсурдного веселья, которое можно было бы придумывать, придумывая идиотские имена, есть ли действительно практическая причина, почему кто-то когда-либо делал бы такие вещи?

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Короткий ответ - нет.Длинный ответ: при создании пользовательской структуры вам даже не нужно предоставлять пользовательский инициализатор.Структура предоставит это для вас.Не относится к вашему вопросу, но вы всегда должны объявлять свои свойства как константы.Если вам нужно другое значение, создайте новую структуру со значениями, обновленными из старого экземпляра.Просто создайте «простую» структуру:

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
}

Действительно практическая причина?

Единственное, что я могуsee отбрасывает self, что уже можно сделать в 99% случаев при кодировании в Swift.Мне действительно очень нравится использовать теневое копирование, когда это возможно во всех моих ответах.Вы можете увидеть это в этом посте Drop метода экземпляра Swift Array (at: Int) , где локальная переменная index скрывает метод сбора index<T: Comparable>(_ T, offsetBy: T, limitedBy: T).

Или на этом посту Swift: второе вхождение с indexOf классический пример теневого копирования

var startIndex = self.startIndex

Где вы можете обратиться к startIndex локальной переменной метода или экземпляру коллекциидобавление свойства с собственным префиксом self.startIndex.

...