let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)
Может ли кто-нибудь объяснить, что $0
и $1
означает в swift?
Больше примеров
array.forEach {
actions.append($0)
}
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)
Может ли кто-нибудь объяснить, что $0
и $1
означает в swift?
Больше примеров
array.forEach {
actions.append($0)
}
$0
- это первый параметр, переданный в замыкание. $1
- второй параметр и т.д. Это закрытие, которое вы указали, является сокращением для:
let sortedNumbers = numbers.sort { (firstObject, secondObject) in
return firstObject > secondObject
}
Он представляет сокращенные аргументы, отправленные в закрытие, этот пример прерывает его:
Swift 4:
var add = { (arg1: Int, arg2: Int) -> Int in
return arg1 + arg2
}
add = { (arg1, arg2) -> Int in
return arg1 + arg2
}
add = { arg1, arg2 in
arg1 + arg2
}
add = {
$0 + $1
}
let result = add(20, 20) // 40
В вашем примере
$0
и$1
являются замыканиями первого и второго строковых аргументов вShorthand Argument Names
. Сокращенные имена аргументов автоматически предоставляются Swift. На первый аргумент может ссылаться$0
, на второй аргумент может ссылаться$1
, на третий аргумент -$2
и т.д. на.
Как вы знаете, замыкание, очень близкое к лямбда-функции, или малая анонимная функция, является автономным блоком функциональности, который можно передать вокруг и используется в вашем коде. У Closure разные названия в других языках программирования, а также небольшие различия в значении - это лямбда в Python и котлин или блок в C и Objective-C.
Shorthand Argument Names
:FIRST EXAMPLE :
let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]
func backward(_ n1: String, _ n2: String) -> Bool {
return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)
/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )
reverseOrder = coffee.sorted(by: { $0 > $1 } )
/* $0 and $1 are closures first and second String arguments. */
reverseOrder = coffee.sorted(by: >)
/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */
SECOND EXAMPLE :
let companies = ["bmw", "kfc", "ibm", "htc"]
let uppercasedCompanies = companies.map { (item) -> String in item.uppercased() }
/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */
let uppercasedCompanies = companies.map { $0.uppercased() }
/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */
THIRD EXAMPLE :
filter
:let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let filteredNumbers = numbers.filter { ($0 % 2) == 0 }
print(filteredNumbers)
/* RESULT: [2, 4, 6, 8, 10] */
FOURTH EXAMPLE :
$0
сокращенное название аргумента для кубической степени:let cubedNumber = { $0 * $0 * $0 } (25)
print(cubedNumber)
/* RESULT: 25^3 = 15625 */
FIFTH EXAMPLE :
$0
, $1
, $2
:let math: (Int8, Int8, Int8) -> Int8 = { $0 + $1 - $2 }
func feedClosure() -> (Int8, Int8, Int8) -> Int8 {
return math
}
feedClosure()(10, 20, 100)
/* RESULT: (10 + 20 - 100) = -70 */
SIXTH EXAMPLE :
$0
, $1
, $2
, $3
, $4
:let factorial = { $0 * $1 * $2 * $3 * $4 } (1, 2, 3, 4, 5)
print(factorial)
/* RESULT: 5! = 120 */
SEVENTH EXAMPLE – Swift vs Kotlin vs Python :
let element: [String] = ["Argentum","Aurum","Platinum"]
let characterCount = element.map { $0.count }
print(characterCount)
/* RESULT: [8, 5, 8] */
Часто лямбда-выражение Kotlin имеет только один параметр с неявным именем: it
.
val element = listOf("Argentum","Aurum","Platinum")
val characterCount = element.map { it.length }
println(characterCount)
/* RESULT: [8, 5, 8] */
But in Python there no equivalent of Shorthand Argument Name
.
element = ["Argentum","Aurum","Platinum"]
characterCount = list(map(lambda x: len(x), element))
print(characterCount)
/* RESULT: [8, 5, 8] */
Ссылка на первый и второй аргументы сортировки. Здесь sort
сравнивает 2 элемента и упорядочивает их.
Вы можете найти официальную документацию Swift для получения дополнительной информации:
Swift автоматически предоставляет сокращенные имена аргументов для встроенного замыкания, которые можно использовать для ссылки на значения замыканий аргументы с именами $ 0, $ 1, $ 2 и так далее.
В дополнение к ответу @Bobby я хотел бы добавить пример
var add: (Int,Int,Int)->Int
add = {
//So here the $0 is first argument $1 is second argument $3 is third argument
return $0 + $1 + $2
//The above statement can also be written as $0 + $1 + $2 i.e is return is optional
}
let result = add(20, 30, 40)
print(result) // Prints 90
Это имена сокращенных аргументов.
Swift автоматически предоставляет имена сокращенных аргументов для встроенных закрытий, которые могут использоваться для ссылки на значения аргументов замыканий именами $0, $1, $2 и т.д.
Если вы используете эти сокращенные имена аргументов в своем выражении закрытия, вы можете опустить список аргументов закрытия из его определения, а число и тип имен сокращенных аргументов будут выведены из ожидаемого типа функции. Ключевое слово in также можно опустить, поскольку выражение закрытия полностью состоит из его тела:
reversed = names.sort( { $0 > $1 } )
Здесь $0 и $1 относятся к закрытию первого и второго аргументов String.