Я заметил при написании assert
в Swift, что первое значение напечатано как
@autoclosure() -> Bool
с перегруженным методом, чтобы вернуть общее T
значение, чтобы проверить существование через LogicValue
protocol
.
Однако строго придерживаться поставленного вопроса. Похоже, что хочет, @autoclosure
который возвращает Bool
.
Запись фактического замыкания, которое не принимает параметров и возвращает Bool, не работает, он хочет, чтобы я вызвал замыкание для его компиляции, вот так:
assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)
Однако простое прохождение Bool работает:
assert(false, "No user has been set", file: __FILE__, line: __LINE__)
Так, что происходит? Что такое @autoclosure
?
Изменить: @auto_closure
был переименован@autoclosure
f({2 >1}())
f(2 > 1)
работает. Вызовf({2 > 1})
не удается сerror: function produces expected type 'Bool'; did you mean to call it with '()'?
. Я проверил это на детской площадке и с Swift REPL.func f(@autoclosure pred: () -> Bool)
Вот практический пример - мое
print
переопределение (это Swift 3):Когда вы говорите
print(myExpensiveFunction())
, моеprint
переопределение затмевает Свифтаprint
и называется.myExpensiveFunction()
таким образом, завернут в закрытие и не оценивается . Если мы находимся в режиме Release, он никогда не будет оценен, потомуitem()
что не будет вызван. Таким образом, у нас есть версияprint
, которая не оценивает свои аргументы в режиме Release.источник
myExpensiveFunction()
? Если вместо использования автозаполнения вы передадите функцию для печатиprint(myExpensiveFunction)
, как это повлияет? Спасибо.Описание auto_closure из документов:
И вот пример, который Apple использует вместе с ним.
По сути, это означает, что вы передаете логическое выражение в качестве первого аргумента вместо замыкания, и оно автоматически создает замыкание для вас. Вот почему вы можете передать false в метод, потому что это логическое выражение, но не может передать замыкание.
источник
@auto_closure
здесь. Код работает отлично без него:func simpleAssert(condition: Bool, message: String) { if !condition { println(message) } }
. Используйте,@auto_closure
когда вам нужно повторно оценить аргумент (например, если вы реализовывалиwhile
подобную функцию) или вам нужно отложить оценку аргумента (например, если вы реализовали короткое замыкание&&
).autoclosure
сwhile
-like функции? Кажется, я этого не понимаю. Большое спасибо заранее.Это показывает полезный случай
@autoclosure
https://airspeedvelocity.net/2014/06/28/extending-the-swift-language-is-cool-but-be-careful/источник
Это просто способ избавиться от фигурных скобок в вызове замыкания, простой пример:
источник
@autoclosure
является параметром функции, который принимает готовую функцию (или возвращаемый тип), в то время как общийclosure
принимает необработанную функциюДавайте посмотрим на пример
источник