2016-12-15 2 views
1

저는 재귀 적으로 정의 된 데이터 구조를 가지고 놀고 있습니다.클로저는 중첩 된 함수에서 사용될 때 어떻게 이스케이프 처리합니까?

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 [] 
    } 
} 

이 중첩 된 기능의 사용 좋은 인상을 받았는데 : 순회 코드가 필요한 유일한 범위를 탈출하지 않는 배열에 아래로 비등이 내가 map을 위해 할 것입니다. (의가 여기 진정의 경우 가정하자.)

그러나 스위프트는 불평 : 비 탈출 매개 변수 '피 시험 메모리'를 통해

선언 폐쇄가 탈출 할 수 있습니다. 물론

, 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을 참조하십시오. 현재 상태 : 열기, 할당 해제.