Функции Inout против функций, которые возвращают переданный параметр - PullRequest
0 голосов
/ 28 сентября 2018

В Swift, когда предпочтительнее использовать функции inout, а не функции, которые модифицируют один параметр и возвращают этот измененный параметр?

Это, вероятно, индивидуальный сценарий, и я чувствую, что использую функцию, которая возвращаетпереданный параметр более явный в вызове и, следовательно, более читабельный, но я не уверен, например, о влиянии копирования объекта на память.

Возьмем следующий пример:

func addConstraints(to label: UILabel) -> UILabel {
  let constrainedLabel = label
  //Add all constraints to constrained label
   return constrainedLabel
}

Является ли это благоприятным для:

func addConstraints(to label: inout UILabel){
   //Add constraints
}

Большое спасибо и извините, если на этот вопрос уже дан ответ или он слишком широкий.

Редактировать, потому что я, очевидно, использовал наихудший возможный пример:

Что лучше:

let num = 5
num = addOne(to: num)

func addOne(to num: Int) -> Int {
 return num + 1
}

или

let num = 5
addOne(to: num)

func addOne(to num: inout Int) -> Int {
  num + 1
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Используйте первый подход без необходимости дублировать UILabel

func addConstraints(to label: UILabel){
  //Add all constraints to label
}

Вы можете изменить свойства экземпляра класса, даже если этот экземпляр является константой (let).

Так же, как вы можете изменить текст метки let:

let label = UILabel()

label.text = "Hello"
print(label.text!)    //"Hello"

label.text = "world"

print(label.text!)    //"world"

В стандартной библиотеке уже есть функция, которая делает это: addConstraints(_:).

0 голосов
/ 28 сентября 2018

Вы почти никогда не нуждаетесь в параметре inout при обычном использовании Swift.

Конечно, в первом случае , который вы даете, вам не нужно inout параметр или возвращаемого значения, потому что UILabel - это класс, который тип ссылки .

Во втором случае, при прочих равных условиях, первый подход лучше:

var num = 5
num = addOne(to: num)

Пример inout точно такой жеЭффект - он заменяет значение num другим Int - абсолютно без усиления и с увеличением опасности.

0 голосов
/ 28 сентября 2018

Вам не нужно inout только для ссылочного типа (классы здесь UILabel)

func addConstraints(to label: UILabel) {

  // add constraints and they will be applied to the label
} 
...