私は再帰的に定義されたデータ構造で遊んでいます。これは私が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
は今と同じ方法で、逃れることができますか?
私には何が欠けていますか?最初のバージョンを動作させる方法はありますか?
おそらく、コンパイラのバグでしょう。私はバグレポートを開きます。ネストされた関数は、必ずしもサポートされているわけではありません。 –
@RobNapierそれはおそらく私ではないことを知って良い!すでに報告されているようです(https://bugs.swift.org/browse/SR-2274)。 – Raphael