2017-09-27 9 views
0

Swift 대리인 주위에서 머리를 쓰려고 노력하고 있으며 놀이터를 훔쳤거나/노크 업했지만 대리자 함수를 호출 할 수없는 것처럼 보입니다.Swift 3 대리인 함수가 호출되지 않았습니다.

protocol fBookDelegate:class { 
    func processData(data: String) 
} 

class fBook { 

weak var delegate: fBookDelegate? 

init() { 
    print("initialising fBook") 
    delegate?.processData(data: "hello world") 
    print("we should have printed") 
    } 
} 

class fMain: fBookDelegate { 
init() { 
    print("initialising fMain") 
    let getfBook = fBook() 
    getfBook.delegate = self 
    print("all done let's rumble") 
    } 

func processData(data: String) { 
    print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

누구든지 내 실수를 감지 할 수 있습니까?

protocol fBookDelegate:class { 
    func processData(data: String) 
} 

class fBook { 

    weak var delegate: fBookDelegate? 

    init() { 
     print("initialising fBook") 
    } 

    func talkToMe() { 
     delegate?.processData(data: "hello world") 
    } 
} 

class fMain: fBookDelegate { 
    init() { 
     print("initialising fMain") 
     let getfBook = fBook() 
     getfBook.delegate = self 
     getfBook.talkToMe() 
     print("all done let's rumble") 
    } 

    func processData(data: String) { 
     print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

또 다른 매개 변수로 위임 소요 사용자 정의 초기화 방법이 될 것입니다 :

내가 출력을 얻을 모든

initialising fMain 
initialising fBook 
we should have printed 
all done let's rumble 
+0

당신은 fBook의 초기화에 대리자를 사용하려는하지만 당신은 당신이를 초기화하기 전까지는 설정하지 않는다 목적. –

+0

fBook init을 수정하여 나중에 대리인을 속성으로 지정하는 대신 매개 변수로 사용합니다. – ghostatron

답변

2

당신은 다음과 같이 사용할 수 있습니다

import UIKit 
protocol fBookDelegate:class { 
    func processData(data: String) 
} 
class fBook { 
    init(delegate: fBookDelegate?) { 
     print("initialising fBook") 
     delegate?.processData(data: "hello world") 
     print("we should have printed") 
    } 
} 
class fMain: fBookDelegate { 
    init() { 
     print("initialising fMain") 
     let getfBook = fBook(delegate: self) 
     print("all done let's rumble") 
    } 
    func processData(data: String) { 
     print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

출력 :

initialising fMain 
initialising fBook 
processing data from fBook with hello world 
we should have printed 
all done let's rumble 
0

여기 당신의 대리자를 사용하기위한 하나 개의 옵션들 중 하나입니다.

+0

아마도 Delegates를 이해하지 못하고 있지만, 예를 들어 버튼을 클릭하거나 테이블을 탭한 경우 fBook에서 전화를 걸고 싶습니다. 그런 다음 객체/데이터/문자열이 fBook에서 fMain으로 전송되어 UI를 업데이트 할 수 있습니다. 나는 이것에 대해 잘못 돌아가고 있는가? – depicus

+0

그건 나에게 잘 들리 네. 기본적으로, 당신이해야 할 일은'talkToMe'를 당신이 처리하고자하는 이벤트의 타입에 응답하는 어떤 종류의 IBAction 메소드로 대체하는 것입니다. 내 요점은, 당신이 그것을 사용하기 전에 대리인을 설정해야한다는 것입니다 - 또는 당신이 본 것처럼 - 아무 일도 일어나지 않습니다. –

+0

개체 범위가 올바른지 확인하십시오. 'fMain'이'init'을 끝낸 후에'fBook'이 일을하기를 원하면 뭔가 살아 있어야합니다. –