2016-11-11 6 views
0

의 방법을 사용하여 :나는 프로토콜과 프로토콜의 확장 만든 프로토콜

protocol SomeProtocol: class { 
    var someView: UIView { get set } 

    func handlePan(recognizer: UIPanGestureRecognizer) 
} 

extension SomeProtocol where Self: UIViewController { 
    func handlePan(recognizer: UIPanGestureRecognizer) { 
     // implementation 
    } 
} 

class SomeViewController: UIViewController, SomeProtocol { 

    var someView = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     someView.frame = CGRect(x: 100, y: 200, width: 50, height: 50) 
     someView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(handlePan))) 
     someView.backgroundColor = .black 

     view.addSubview(someView) 
    } 
} 

을하지만 만드는 메신저 UIPanGestureRecognizer를 Where이 나에게 오류를주고있다 :

Error: Argument of '#selector' refers to instance method 'handlePan(recogniser:)' that is not exposed to Objective-C

인가 거기 방법을보기 컨트롤러에 handlePan 메서드를 추가하는 대신이 문제를 해결하려면?

+0

(handlePan (_ :))' – vadian

+0

@vadian 사실상 정식 서명은'#selector (handlePan (recognizer :))'일 것이다. - handlePan이 명확하지 않다하더라도, #selector (handlePan)은 완벽하게 수용 가능하다. – Hamish

답변

0
당신은 목표 - C 런타임 라이브러리에 노출 @objc와 프로토콜에 주석을 달 필요가

:이 방법은 서명이`#selector 있어야하는 매개 변수를 사용하기 때문에

@objc protocol SomeProtocol: class { //... 
+0

이제 xcode가 'Non'@ objc '속성에 대해 불평하고 있습니다 ... 다른 속성에 대한'@objc 'protocol' 요구 사항을 만족하지 않습니다. '@ objc'를 추가하지 않고도 다른 방법이 있습니까? –

+0

아니, 당신은 스위프트 프로토콜과 함께 Objective C 런타임의 기능을 사용하려고합니다. 프로토콜은 Objective C 런타임에 노출되어야한다. 당신은 그 오류를 분류해야 할 것이다. SO 주변을 검색하거나 필요한 경우 새로운 질문을 올리십시오. – Alexander

+2

그래, 지금이 문제는 Objective-C가 프로토콜 확장을 볼 수 없다는 것입니다.) – Hamish