Это одна вещь, которую я не понимаю в Swift - PullRequest
0 голосов
/ 01 июля 2019

Рассмотрим эти строки:

Я создаю класс на основе NSButton с этим:

typealias onClickHandler = (NSTextfieldSuper)->Void
var onClick: onClickHandler?

Когда пользователь нажимает на экземпляр этой кнопки, я делаю это:

if (self.onClick != nil) {
   onClick?(self)
}

Я использую эту кнопку позже, из другого класса, с этим:

let button = SuperButton()
button.onClick = { (textField: NSTextfieldSuper)->Void in 
}

Я не уверен, что это правильный синтаксис.Я хотел бы обработать кнопку, отправленную из первого замыкания родительского класса, в котором она создана.

Это была единственная форма, которую я смог набрать без жалоб XCode.Если это правильно, какова цель этого ->Void там?Что это могло бы вернуть?

Я просто хочу обработать отправленную кнопку.

Кстати, в качестве бонуса, я должен инициализировать несколько кнопок с этой кнопкой, все из которых работают по одной и той же функции.Было бы неплохо сделать что-то вроде

func doSomething () {
}

, а затем

let button = SuperButton()
button.onClick = doSomething

какие-нибудь идеи?

1 Ответ

1 голос
/ 01 июля 2019

Это была единственная форма, которую я смог набрать без жалоб XCode. Если это правильно, какова цель этого ->Void там? Что это может вернуть?

То же, что и в typealias, в Swift тип функции имеет вид:

( определения параметров ) -> тип возврата

и функции, которые ничего не возвращают, имеют тип возврата Void (аналогично C). Форма full из выражения замыкания:

{ ( определения параметров ) -> тип возврата in body }

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

Теперь Swift выведет много вещей, и для выражений замыкания доступны различные сокращения, вы обнаружите, что Swift принимает:

button.onClick = { textField in }

также здесь с типом аргумента и возвращаемого значения замыкания.

Кстати, как бонус, [...] есть идеи?

Просто сделайте совпадение типов:

func doSomething(textField : NSTextfieldSuper) { }
button.onClick = doSomething

В отличие от (в Objective-) функции C и замыкания (блоки в C) взаимозаменяемы (как и во многих других языках, C здесь лишний раз)

НТН

...