2016-11-14 5 views
2

私はスウィフト3に更新した後、次のコード行で困難を抱えている:それではAssigning non-escaping parameter 'f' to an escaping closure奇妙なエスケープ関数の動作スウィフトに更新した後、3

:私は、コンパイラエラーを与えた

private var functionHandlers = [(() -> Int) ->()]() 

private var myFunction: (() -> Int)? 

func doRegister() { 
    functionHandlers.append { (f: (() -> Int)) in 
     myFunction = f 
    } 
} 

func doRegister() { 
    functionHandlers.append { (f: @escaping (() -> Int)) in 
     myFunction = f 
    } 
} 

と、この:

func doRegister() { 
    functionHandlers.append { (f: (@escaping() -> Int)) in 
     myFunction = f 
    } 
} 
、私はこれを試してみました 両方のケースでは、私の最初のエラーを修正し、

が、その後、私に新しいコンパイラエラーを与えた:Cannot convert value of type '(@escaping (() -> Int)) ->()' to expected argument type '(() -> Int) ->()'

それでは、私は次のようにfunctionHandlersの種類を変更しようとした:ちょうど

private var functionHandlers = [(@escaping (() -> Int)) ->()]() 

が、その構文エラーが発生しました。

誰も私にこれがなぜ起こっているのか、私はこれを修正するために何ができるのか説明できますか?

+0

末尾の '.append {} 'はどこから来ますか? – Alexander

+0

彼は関数を追加しています@AlexanderMomchliov – Hamish

+0

@Hamishああ私は参照してください – Alexander

答えて

3

私にはバグのようです。

private var functionHandlers = [(@escaping() -> Int) ->()]() 

を、それは次のように行います:何らかの理由で、コンパイラは構文を好きではない

private var functionHandlers : [(@escaping() -> Int) ->()] = [] 

それは同じ症状だが、私はそれがthe compiler rejecting the [TypeA.TypeB]() syntax with nested typesと同じ原因だわかりませんよ。その問題のように、それを解決するための別の方法は、使用しているがtypealias

typealias F = (@escaping() -> Int) ->() 

private var functionHandlers = [F]() 

あなたは正しくとしてそれを実装しようとしたとして、あなたはその後、doRegister()を実装できます。

func doRegister() { 
    functionHandlers.append { (f: @escaping() -> Int) in 
     myFunction = f 
    } 
} 

あなたは確かにオーバーfile a bug reportを必要がありますが[(@escaping() -> Int) ->()]()はコンパイルされません。

+0

:) – Alexander

+0

私は同じ問題を見てきました(そして、タタリアスでそれを取り巻く)。 – matt

+1

ありがとう、Hamish。私はここにバグレポートを提出しました:https://bugs.swift.org/browse/SR-3208 –

関連する問題