2014-12-30 4 views
0

두 개의 매개 변수가 생성자에 전달됩니다.inout 매개 변수와 함께 함수를 전달하면

A) 유형이 그것)가 PARAMS을 변경할 수 있도록 (AN 입출력 PARAMS를 수신하는 기능입니다 함수

b)에 당신의 PARAMS 객체를 전달 전달 함수가 객체를 수정할 수 있습니다 기대

그러면 apply 메소드가 트리거되어 전달 된 함수가 전달 된 매개 변수를 변경할 수 있습니다.

클로저에 매개 변수를 전달하는 솔루션이있는 경우에도 작동합니다. 작동하지만 여전히 최선의 전략에 대한 당신의 의견들 필요 물론 AnyObject 및 폐쇄와를 사용하여

class Test { 

    var params: Any? 

    var myFunc: (inout params: Any?) ->() = { (inout params: Any?) in return } //default value 


    //constructor receving a function and a address to inout params object 
    init(myFunc: (inout params: Any?) ->(), inout params: Any?) { 
     self.myFunc = myFunc 
     self.params = params 
    } 

    //call the passed function (extern) and pass the address of given params 
    func apply() { 
     self.myFunc(params: &self.params) 
    } 
} 

func extern(inout params: Any?) { 
    var a = params as [String: Int] 
    a["factor"] = 11 
} 

var p: Any = ["factor": 10] 
var test = Test(myFunc: extern, params: &p) 

test.apply() //p["factor"] should be 11 now here 

p["factor"] as [String: Int] 

내 두 번째 시도하여 폐쇄

//Utility 

class Test { 

    var closure:() -> Any 

    var myFunc: (message: String, closure:() -> Any) ->() = { (message: String, closure:() -> Any) in return } 

    init(myFunc: (message: String, closure:() -> Any) ->(), closure:() -> Any) { 
     self.myFunc = myFunc 
     self.closure = closure 
    } 

    func apply(message: String) { 
     self.myFunc(message: message, closure: self.closure) 
    } 

} 

//users of the utility 

func extern(message: String, closure:() -> Any) { 
    println(message) 
    var name = closure() as [String: String] 
    name["name"] = "Doe" 
} 

var name: Any = ["name": "John"] 

var test = Test(myFunc: extern, closure: {name}) 
test.apply("hello ") 
name //it's still John here 

3 시도

.

//Utility 

class Test { 

    var closure:() -> AnyObject 

    var myFunc: (message: String, closure:() -> AnyObject) ->() = { (message: String, closure:() -> AnyObject) in return } 

    init(myFunc: (message: String, closure:() -> AnyObject) ->(), closure:() -> AnyObject) { 
     self.myFunc = myFunc 
     self.closure = closure 
    } 

    func apply(message: String) { 
     self.myFunc(message: message, closure: self.closure) 
    } 

} 

//users of the utility 

func extern(message: String, closure:() -> AnyObject) { 
    println(message) 
    var name: Name = closure() as Name 
    name.name = "Doe" 
} 

class Name { 
    var name = "John" 
} 

var name = Name() 

var test = Test(myFunc: extern, closure: {name}) 
test.apply("hello ") 
name //it's changed here 
+0

당신은 당신이 뭘하려는 건지에 대한 자세한 내용을 줄 수 있습니까? 'params'는 이니셜 라이저에서만'inout'이 될 것이고'self.params = params'를 통해 저장하려고하면'params'가 값 타입이라면 참조를 유지하지 않습니다. –

+0

뒤에서 필터 패턴을 사용하면 리스너로 등록 된 고유 한 필터 함수를 전달하고, 나중에 유틸리티가 리스너를 호출하면 param 객체를 필터 함수로 전달하고 필터 함수에서 계속 진행할지 또는 그렇지 않으면 param 값을 변경할 수도 있습니다. 개념은 – user2727195

+0

입니다. 이니셜 라이저 외에도 매개 변수의 주소가 표시되지 않는다는 점을 알고 있습니다. 그렇게 할 수있는 다른 방법, 클로저를 사용하는 전략 또는 사용을 제한해야합니다. AnyObject는 항상 참조로 전달됩니다 – user2727195

답변

1

여기에서 클로저를 다시 작성하려는 것 같습니다. 클로저의 한 가지 점은 주변의 값에 대한 참조를 캡처 할 수 있다는 것입니다. 이것은 위에서 설명하고 어떻게해야, 당신은 당신의 변수에 대한 적절한 유형을 사용하기보다는 Any에 다시 떨어지는 유지 할 수 있습니다 :

class Test { 
    var myFunc:() -> Void = { } 

    init(myFunc:() -> Void) { 
     self.myFunc = myFunc 
    } 

    func apply() { 
     self.myFunc() 
    } 
} 

func extern(inout dict: [String: Int]) { 
    dict["factor"] = 11 
} 

var p = ["factor": 10] 

let test = Test { 
    extern(&p) 
} 

test.apply() // p["factor"] is now 11 here 

println(p) 
// ["factor": 11] 
+0

우리는 Test around P를 인스턴스화 할 수 없습니다. p (param) 및 filter func은 유틸리티의 사용자이지만 test는 유틸리티를 이미 인스턴스화했습니다. p (param) 주변의 closure를 만들 수 있습니까?) 우리 함수로 유틸리티에 전달하고 param이나 다른 전략을 변경하는 함수를 기대하십시오 – user2727195

+0

다른 것을 게시했습니다. 내 시도, 더 많은 빛을 발산 할 것입니다. – user2727195

+0

AnyObject를 사용하여 제 3의 시도를 시도했지만 물론 작동했지만 클래스를 사용하는 것으로 제한되어 있지만, 이보다 나은 전략은 잘하면 더 많은 빛을냅니다. – user2727195

관련 문제