2016-10-14 1 views
2

Swift 3 требует, чтобы все метки признаков были включены в вызов функции по умолчанию. Тем не менее, когда функция назначается переменной (или константе), а переменная передает аргументы, метки аргументов не нужны или даже не разрешены.Быстрые аргументы не разрешены, если функция назначена переменной?

Например, для функции с двумя параметрами Int (int1 и int2), присвоенных переменной называется varName:

varName (1, 5) // will work, but 
varName (int1: 1, int2: 5) //produces an error for extraneous argument labels. 
  1. ли мое понимание правильно?

  2. В чем обоснование отсутствия имен аргументов здесь? (Я не могу найти никакой документации по этому вопросу.)

+3

Это поможет, если вы обновили свой вопрос с полным примеров, демонстрирующих свой вопрос. – rmaddy

+2

Я думаю, вы захотите прочитать это: https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md – jtbandes

+0

@jtbandes Да, это статья прямо ответила на мой вопрос. Огромное спасибо. –

ответ

1
  1. Да.
  2. См. SE-0111 - Remove type system significance of function argument labels.

Пример:

func foo(bar: Int, baz: String) { 
    print(bar, baz) 
} 

foo(bar: 123, baz: "abc") // Valid, prints: 123 abc 

let x = foo //Inferred type: (Int, String) -> Void 
x(123, "abc") // Valid, prints: 123 abc 

let y: (bar: Int, baz: String) -> Void = foo // Invalid 
    // ERROR at line 10, col 9: function types cannot have argument label 'bar'; use '_' instead 
    // let y: (bar: Int, baz: String) -> Void 
    //  ^
    //   _ 
    // ERROR at line 10, col 19: function types cannot have argument label 'baz'; use '_' instead 
    // let y: (bar: Int, baz: String) -> Void 
    //     ^
    //     _ 
y(bar: 123, baz: "abc") // Invalid 
    // ERROR at line 19, col 2: extraneous argument labels 'bar:baz:' in call 
    // y(bar: 123, baz: "abc") // 123 abc 
    // ^~~~~~  ~~~~~ 
Смежные вопросы