2016-12-15 5 views
1

私は再帰的に定義されたデータ構造で遊んでいます。これは私がmapのために何をすべきかで、配列にそれを煮詰め:ネストされた関数でクロージャが使用されている場合、どのようにエスケープすることができますか?

func map<T, U>(_ arr: [T], _ mut: T -> U) -> [U] { 
    func recMap(_ i : Int) -> [U] { 
     if i >= arr.count { 
      return [] 
     } else { 
      return [mut(arr[i])] + recMap(i+1) 
     } 
    } 

    if arr.count > 0 { 
     return recMap(0) 
    } else { 
     return [] 
    } 
} 

これは、ネストされた関数の良い使用されているように私を打つ:トラバーサルコードは、それが必要なのだけスコープをエスケープしません。 (のは、それはここで本当にケースであると仮定しましょう。)

しかし、スウィフトは文句:非エスケープパラメータ「MUT」オーバー

宣言閉鎖は、それが脱出することを可能にします。もちろん

recMapは奇妙なことを行うことができますが、それはしていません。コンパイラはそれを理解できないという問題ですか?私の混乱を深め何

は、このコードが動作することである:

private func recMap<T, U>(_ arr: [T], _ i : Int, _ mut: (T) -> U) -> [U] { 
    if i >= arr.count { 
     return [] 
    } else { 
     return [mut(arr[i])] + recMap(arr, i+1, mut) 
    } 
} 

func map<T, U>(_ arr: [T], _ mut: (T) -> U) -> [U] { 
    if arr.count > 0 { 
     return recMap(arr, 0, mut) 
    } else { 
     return [] 
    } 
} 

確かに、mutは今と同じ方法で、逃れることができますか?

私には何が欠けていますか?最初のバージョンを動作させる方法はありますか?

+1

おそらく、コンパイラのバグでしょう。私はバグレポートを開きます。ネストされた関数は、必ずしもサポートされているわけではありません。 –

+0

@RobNapierそれはおそらく私ではないことを知って良い!すでに報告されているようです(https://bugs.swift.org/browse/SR-2274)。 – Raphael

答えて

2

これは、エスケープ動作を分析するコンポーネントの欠点が原因であると思われます。それは明らかに少し防御的です。

this bug reportを参照してください。現在の状態:Open、Unassigned。

関連する問題