2016-12-24 12 views
1

私はswift 3に新しいです。私は既存のコードを持っていて、それをswift 3に変換したいと思います。xcodeがなぜパラメータ名の前に_を挿入する必要があるのか​​不思議です。なぜクロージャのパラメータに `_`を必要とするのか?

func anotherClosure(age: Int, name: String, handler: (_ name: String, _ age: Int) ->()) { 
     handler(name, age) 
    } 

私はネット上で検索していますが、回答が見つかりませんでした。ハンドラを渡す複数の値を持つクロージャを作成するより良い方法がある場合は、以下にコメントしてください。前スウィフト3に

おかげ

+0

https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md – Alexander

答えて

0

は、パラメータ名は、これまでの型システムが心配していたとして、タイプの一部でした。しかし、キーワード名が適切に一致するように強制すると、クロージャを悪夢に使うことになります。したがって、型システムはそれらを無視した。なぜなら、それらが最初の型の型の一部である理由が問われるからである。

import CoreFoundation 

func applyAndPrint(closure: (a: Double, b: Double) -> Double, _ a: Double, _ b: Double) { 
    print(a, b, closure(a: a, b: b)) 
} 

//All these have different types, because of their different keyword parameter names. 
let adder: (augend: Double, addend: Double) -> Double = { $0 + $1 } 
let subtractor: (minuend: Double, subtrahend: Double) -> Double = { $0 - $1 } 
let multiplier: (multiplicand: Double, multiplier: Double) -> Double = { $0 * $1 } 
let divider: (dividend: Double, divisor: Double) -> Double = { $0/$1 } 
let exponentiator: (base: Double, exponent: Double) -> Double = { pow($0, $1) } 
let rooter: (degree: Double, Radicand: Double) -> Double = { pow($1, 1/$0) } 

// Yet the type system ignores that, and all these are valid: 
applyAndPrint(adder, 2, 3) 
applyAndPrint(subtractor, 2, 3) 
applyAndPrint(multiplier, 2, 3) 
applyAndPrint(divider, 2, 3) 
applyAndPrint(exponentiator, 2, 3) 
applyAndPrint(rooter, 2, 3) 
関連する問題