+
- это оператор infix
и имя функции в Swift. Существует много таких функций, определенных для многих типов (они перегружены).
Вы можете определить +
для своего собственного пользовательского типа. Например:
struct Foo {
var value: Int
static func +(_ lhs: Foo, _ rhs: Foo) -> Foo {
return Foo(value: lhs.value + rhs.value)
}
}
var f1 = Foo(value: 5)
var f2 = Foo(value: 3)
let f3 = f1 + f2
print(f3.value) // 8
Это работает:
let plus: (Int, Int) -> Int = (+)
, поскольку подпись функции +
полностью указана, поэтому Swift может определить правильную функцию +
.
И если мы хотим присвоить нашу новую +
функцию plus
:
let plus: (Foo, Foo) -> Foo = (+)
Это действительно ничем не отличается от этого:
func add(_ a: Int, _ b: Double) -> Double {
return Double(a) + b
}
let plus: (Int, Double) -> Double = add
print(plus(3, 4.2)) // 7.2
Так почему же в скобках? Зачем указывать (+)
вместо просто +
?
+
также является унарным оператором в Swift.
Например, вы можете сказать:
let x = +5
Так что просто пытаюсь сказать:
let plus: (Int, Int) -> Int = +
сбивает с толку компилятор, потому что он обрабатывает +
как унарный префиксный оператор и ожидает, что за +
последует что-то еще, такое как 5
. Окружая его круглыми скобками, компилятор Swift затем перестает пытаться анализировать +
как унарный оператор и рассматривает его так же, как имя его функции. Даже если +
не был унарным префиксным оператором, Swift все равно будет ожидать значения по обе стороны от +
, поэтому скобки говорят Swift, что вы не предоставляете какие-либо входные данные для функции, а просто хотите получить функцию сам по себе.
Вы можете ссылаться на функцию +
без скобок в ситуациях, когда она не является двусмысленной. Например:
var arr = [1, 2, 3]
let sum = arr.reduce(0, +)