2014-06-20 2 views
2

in-out 매개 변수를 사용하는 다른 함수를 반환하는 함수는 어떻게 작성합니까?스위프트 : In-Out 함수 반환

incrementor 함수를 반환하는 함수 makeIncrementor을 작성하고 싶습니다. 이 incrementor 함수는 하나의 In-Out 매개 변수를 사용하고 특정 값만큼 증가시킵니다 (아무 것도 반환하지 않습니다). 여기 내 코드는 다음과 같습니다

func makeIncrementor(amount:Int) -> Int->Void { 
    func incrementor(inout variable:Int) -> Void { 
     variable += amount; 
    } 
    return incrementor; 
} 

var x = 1; 
var inc = makeIncrementor(2); 
inc(&x) 
//x should now contain 3 

을하지만, 엑스 코드는 다음과 같은 오류 제공 :

<REPL>:9:12: error: 'Int' is not a subtype of 'inout Int' 
    return incrementor; 
     ^

내가 잘못하고있는 중이 야 무엇을?

func makeIncrementor(amount: Int) -> inout Int -> Void { 
    // ... 
} 

그런 다음 오류가 멀리하지만 내 엑스 코드 충돌을 간다 : 당신이 반환 형식을 변경하는 경우

+0

나는'var inc = makeIncrementor (2)'라고 생각 하나? –

+0

oops, yeah typo – jburns20

답변

0

.

+0

똑같은 일이 생깁니다 ... – jburns20

+0

Xcode가 충돌했습니다 ... –

1

반환되는 함수의 인수 목록은 괄호로 묶어야하며 수정하려는 인수 앞에 inout을 포함해야합니다.

(더 명확하게 볼뿐만 아니라 괄호에 makeIncrementor의 반환 값을 포장하기 위해)

func makeIncrementor(amount:Int) -> ((inout Int) -> Void) { 
    func incrementor(inout variable:Int) -> Void { 
     variable += amount; 
    } 
    return incrementor; 
} 
+0

이제 다음 오류가 발생합니다 : '놀이터 실행 실패 : 오류 : 오류 : 심볼을 찾을 수 없습니다 : __TMdRSi' – jburns20

+0

아마도 Xcode의 버그 일뿐입니다. – jburns20

1

당신은 당신의 makeIncrementor 기능을 선언하는 동안 유형 (inout Int) ->()이있는 incrementor 함수를 반환하는 유형 Int ->()

이 불일치는 당신의 오류에 대한 이유와

을 변화하고 반환
func makeIncrementor(amount:Int) -> Int->() 

func makeIncrementor(amount : Int) -> (inout Int) ->() 

하려면 올바른 수정입니다. 그러나 현재 놀이터에서 해당 코드를 실행하려고하면 충돌이 발생합니다!

OSX 및 iOS Xcode 프로젝트에서 다음 코드를 성공적으로 실행 했으므로 Xcode의 놀이터에 안정성 문제가 아직 남아 있습니다.

func makeIncrementor(amount : Int) -> (inout Int) ->() { 
    func incrementor(inout variable:Int) { 
     variable += amount 
    } 
    return incrementor 
} 

var incByTwo = makeIncrementor(2) 
var incByThree = makeIncrementor(3)  

var a = 5 

println(a) // 5 

incByTwo(&a) 
println(a) // 7 


incByThree(&a) 
println(a) // 10