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
지금 같은 방법으로 탈출 할 수 있습니다 내 혼란을 심화 무엇
이 코드가 작동입니까?
무엇이 누락 되었습니까? 첫 번째 버전을 작동시키는 방법이 있습니까?
아마도 컴파일러의 버그 일 가능성이 높습니다. 나는 버그 보고서를 열 것이다. 중첩 된 함수가 항상 지원되는 것은 아닙니다. –
@RobNapier 아마도 그것이 내가 아닌 것을 알기 좋습니다! 이미 (신고 된) 것으로 보입니다 (https://bugs.swift.org/browse/SR-2274). – Raphael