2015-12-28 2 views

ответ

6

В быстрых знаках функция имя для заданных математических операций. Чтобы передать знак как параметр, тип параметра должен быть функцией, которая принимает два числа и возвращает число. Если команда + щелчок на любом знаке, вы увидите его определение следующим образом:

общественного FUNC + (LHS: Uint8, шк: Uint8) -> Uint8

общественного FUNC + (LHS: INT8, РИТ : iNT8) -> iNT8

общественного FUNC + (LHS: uInt16, РИТ: uInt16) -> uInt16

общественного FUNC + (LHS: Int16, шк: Int16) -> Int16

общественного функ + (lhs: UInt32, rhs: UInt32) -> UInt32

общественного FUNC + (LHS: Int32, шк: Int32) -> Int32

общественного FUNC + (LHS: UInt64, шк: UInt64) -> UInt64

общественного FUNC + (LHS: Int64, РИТ: Int64) -> Int64

общественного FUNC + (LHS: UINT, шк: UINT) -> UInt

общественного FUNC + (LHS: Int, РИТ: Int) -> Int

В вашем случае ваша функция уменьшения должна выглядеть следующим одной

func reduce(sign: (Int,Int)->Int) -> Int{ 

    return sign(2,3) 
} 

reduce(*) 
reduce(-) 
-2

Отправить как символ, а затем перейти к идентификации:

func acceptASign(sign: Character) { 
    switch sign { 
    case "+": 
     //do some addition 
    case "-": 
     //do some subtraction 
    case "*": 
     //do some multiplication 
    case "/": 
     //do some division 
    default: 
     break; 
    } 
} 
+0

Это нормально, но так неуклюжий: ( –

3

Да, вы можете отправить любой бинарный оператор функции reduce(), обеспечивая исходное значение и элементы в коллекции того же типа, и, таким образом, оператор может быть применен.

Подумайте об операторах как о функциях/замыканиях, и вы поймете, почему это возможно в Swift. На самом деле операторы - это как функции - они называются замыканиями.

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

Таким образом, следующий синтаксически правильный, и обеспечивает ожидаемый выход (6):

[1,2,3].reduce(0, combine: +) 
3
func doSomeCalculation(_ fun:((Int,Int)->Int)) -> Int { 
    return fun(12,13) 
} 

doSomeCalculation(+) // 25 
doSomeCalculation(-) // -1 

То же самое может быть сделано для UInt, то IntXX и т.д.

+ является в основном просто функция, которая принимает два аргумента и возвращает ее сумму. Поскольку func являются объектами, подобными любым другим, вы можете передавать их как таковые.

Точно так же вы можете пройти + в reduce.

Смежные вопросы