2017-06-25 6 views
0

Swiftの新機能。私はSwift4の戻り値の型として関数を理解しようとしています。私は外部のパラメータ名を提供する必要はないのですfinalString関数を呼び出している間返品タイプとしての機能Swift 4

func functionAsAReturnType() -> ((String, String) -> String) { 
    func finalString(parameter1: String, parameter2: String) -> (String) { 
     return parameter1 + parameter2 
    } 
    return finalString 
} 
let finalString = functionAsAReturnType() 
finalString("Hello", "World") 

:私は、次の例を使用している場合。

finalString(parameter1: 2, parameter2: 2) 

はなぜです:私はこのような何かをしなければならない関数を呼び出している間

は、しかし、私はそれ自身の上に別の関数としてfinalStringを作成しようか!

これまでのところ、外部パラメータ名がない場合、内部パラメータ名は外部パラメータ名としてデフォルト設定されていました。

答えて

2

あなたが正しいです - 変数に割り当てられた関数を呼び出すと(つまり、別の関数から返された)、パラメータ名はありません。パラメータは直接

func userFactory(factoryName: String) -> (_ firstname: String, _ lastname: String) -> User { 
    return { firstname, lastname in 
     return User(factoryName, firstname, lastname) 
    } 
} 

let factory = userFactory(factoryName: "Factory") 

let user1 = factory("John", "Doe") 
let user2 = factory("Jane", "Doe") 

あなたがしながら、パラメータ名を使用する理由のように呼ばれることになる機能を返すとき_すなわちを使用することを意図しているか、あなたはまだ発信者へのヒントができますがあなたのfunctionAsAReturnTypeメソッドの中にあるのは、スコープ内で宣言された関数であり、変数に代入されていないからです。

func userFactory(factoryName: String) -> (_ firstname: String, _ lastname: String) -> User { 
    func inner(firstname: String, lastname: String) { 
     return User(factoryName, firstname, lastname) 
    } 

    // Look, parameter names :| 
    inner(firstname: "Bob", lastname: "Smith") 

    return inner 
} 

しかし、このルールは、あなたがこのようにあなたの関数を宣言した場合は適用されません。ここで

func userFactory(factoryName: String) -> (_ firstname: String, _ lastname: String) -> User { 
    let inner = { (firstname: String, lastname: String) in 
     return User(factoryName, firstname, lastname) 
    } 

    // No parameters names here 
    inner("Bob", "Smith") 

    return inner 
} 

、あなたはFUNC inner(最後の例のような)の宣言を呼び出していません、いくつかのパラメータで変数innerを呼び出しています。

あなたはすでにすなわち

// Calling a function defined on Int 
let i = 1 
i.distance(to: 100) 

// But if you assign i.distance to a variable, you don't 
// use the parameter names 
let f = i.distance 
f(100) 

TLを存在する機能でこれを見ることができます; DR - あなたはFUNC、使用パラメータの名前を呼び出している場合。関数である変数を使用している場合は、そうではありません。

わかっていないのであれば、これが役立つかどうかはわかりません。また、私はこれについて間違っている場合私に知らせる:

+0

オンポイント。冗長な説明をありがとう – user2511882

関連する問題