2015-10-13 3 views
0

В настоящее время я работаю через руководство по быстрому программированию от Apple и сталкивается с типами функций в качестве типов параметров.Преимущества типов функций в качестве типов параметров в swift?

В обычном порядке,

func add(one : Int , _ two:Int) ->Int 
{ 
    return one+two 
} 
func multiply(one : Int ,_ two : Int) ->Int 
{ 
    return one*two 
} 
func subtract(one : Int , _ two :Int) ->Int 
{ 
    return one-two 
} 
add(1, 2) 
subtract(1 , 2) 
multiply(1 , 2) 

Использование типов функции в качестве параметров,

func add(one : Int , _ two:Int) ->Int 
{ 
    return one+two 
} 
func multiply(one : Int ,_ two : Int) ->Int 
{ 
    return one*two 
} 
func subtract(one : Int , _ two :Int) ->Int 
{ 
    return one-two 
} 

func basic(result : (Int , Int) ->Int,_ one : Int , _ two : Int) 
{ 
    result(one,two) 
} 
basic(add, 1, 2) 
basic(multiply, 2, 3) 

Таким образом, из выше кода видно, что мы пишем дополнительные функции basic() и дополнительные строки кода, которые не так полезно в этом примере и усложняет его. Лучше не использовать типы функций в качестве типов параметров.

Итак, есть ли какой-либо пример, который использует эту функцию?

+0

Обратите внимание, что примеры о функциональности необязательно должны быть наиболее полезными. Чтобы дать некоторые полезные примеры: функция 'add' или' multiply' может быть сохранена в словаре. Или вы можете предоставить отображение оператора (например, '+', '-') для работы. Возможность косвенного вызова функции - это нечто вроде большого. – Sulthan

ответ

1

Если вы посмотрите на стандартную библиотеку Swift, вы увидите, что многие методы делают это как map, который определен на Array.

map принимает функцию, которая преобразует элементы массива в новый массив с новым типом.

Это также общая функция, но для того, чтобы держать его просто я использую функцию, которая сопоставляет Int Массивы:

func map(_ array: [Int], _ transform: Int -> Int) -> [Int] { 
    var result = [Int]() 
    for element in array { 
     result.append(transform(element)) 
    } 
    return result 
} 

// map can be used with other functions 
// and also closures which are functions 
// without a name and can be created "on the fly" 
func addByOne(i: Int) -> Int { 
    return i + 1 
} 
func square(i: Int) -> Int { 
    return i * i 
} 
map([1,2,3], addByOne) // [2,3,4] 
map([1,2,3], square) // [1,4,9] 
// and so on... 

// with closures 
map([1,2,3]) { $0 + 1 } // [2,3,4] 
map([1,2,3]) { $0 * $0 } // [1,4,9] 

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

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