2016-09-19 1 views
2

Когда возвращаемое значение функции - это еще одна функция, нет способа получить имена аргументов возвращенной функции. Является ли это ловушкой быстрого языка?В Swift нет способа получить имена аргументов возвращенной функции?

Например:

func makeTownGrand(budget:Int,condition: (Int)->Bool) -> ((Int,Int)->Int)? 
{ 
    guard condition(budget) else { 
     return nil; 
    } 

    func buildRoads(lightsToAdd: Int, toLights: Int) -> Int 
    { 
     return toLights+lightsToAdd 
    } 

    return buildRoads 
} 

func evaluateBudget(budget:Int) -> Bool 
{ 
    return budget > 10000 
} 

var stopLights = 0 

if let townPlan = makeTownGrand(budget: 30000, condition: evaluateBudget) 
{ 
    stopLights = townPlan(3, 8) 
} 

помнить о townPlan, townPlan(lightsToAdd: 3, toLights: 8) бы гораздо более разумным townPlan(3, 8), верно?

ответ

2

Вы правы. Из примечаний к выпуску Swift 3:

Ярлыки аргументов были удалены из типов функций Swift ... Неприменимые ссылки на функции или инициализаторы больше не содержат метки аргументов.

Таким образом, тип townPlan, т.е. типа возвращается из вызова makeTownGrand, является (Int,Int) -> Int - и не несет никакой внешней информации аргумент метки.

Для полного обсуждения обоснования см. https://github.com/apple/swift-evolution/blob/545e7bea606f87a7ff4decf656954b0219e037d3/proposals/0111-remove-arg-label-type-significance.md

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