이 코드는 컴파일되지 않으며 어리석은 것처럼 보일 수도 있지만 왜 그렇게 중요한지 설명 할 것입니다.@objc 프로토콜과 옵션 및 확장을 동시에 사용하는 방법은 무엇입니까?
@objc protocol p {
optional func f1()
func f2()
}
extension p {
func f1() { }
func f2() { }
}
class foo: p {
}
컴파일러는 Type c does not conform to protocol 'p'
을 말한다과 동시에 옵션과 확장을 @objc 사용할 수 없습니다 (그리고 중이 시나리오의 sence가되지 않습니다) 때문 어쩌면입니다. (주된 이유는 내가 @objc 사용) 내 확장에서 프로토콜에 정의 된 비 선택 방법에 대한 선택을 설정할
: 그러나 다음의 예를 살펴
func f1() { }
->func f1() { ... #selector(Self.f2) ... }
그리고 또한 내 f2()
함수의 기본 동작을 원합니다. 내가 f2()
을 optional
으로 표시하면 #selector
에서 사용할 수 없습니다. 왜냐하면 컴파일러는이 메소드가 실제로 필요한지 여부를 알지 못하기 때문입니다. 물론, 글로벌 메소드와 같은 많은 불쾌한 해결 방법이 있습니다. Selector
을 메소드에 입력으로 보내고 있지만,이를 구현하는 데는 깨끗한 방법이 있습니까?
의 ViewController가 Refreshable
및 ContentLoader
를 구현하는 경우는 기본 refresh
기능을 찾을 수없는, 지금은 실제적인 문제
@objc
protocol Refreshable {
weak var refreshControl: UIRefreshControl? { get set }
optional func setupRefreshControl()
func refresh()
}
@objc
protocol ContentLoader {
func load(reset: Bool)
}
extension Refreshable where Self: ContentLoader {
func refresh() {
delay(0.75) { [weak self] in
self?.load(true)
}
}
}
extension Refreshable where Self: UICollectionViewController {
func setupRefreshControl() {
let newRefreshControl = UIRefreshControl()
newRefreshControl.tintColor = UIColor.grayColor()
newRefreshControl.addTarget(self, action: #selector(Self.refresh), forControlEvents: .ValueChanged)
collectionView?.addSubview(newRefreshControl)
refreshControl = newRefreshControl
}
}
이지만, setupRefreshControl
을 찾을 수 없습니다. 그래서 refresh
을 선택 사항으로 표시하겠습니다. 그러나 그렇게함으로써 더 이상 선택자로 보낼 수 없습니다. >optional func refresh()
및
let str = "refresh"
let sel = Selector(str)
그것은 예 컴파일러를 silents,하지만 난이 생각 unrecognized selector sent to instance....
오류를 재현 할 수 없습니다. 실제 코드 ('f1'과'f2'와 당신이 프로토콜'p'를 따르고 자하는 클래스의 관련 코드)를 게시하여 다른 사람들과 내가 당신을 도울 수 있도록하십시오. 또한 매우 흩어져 있고 불분명하기 때문에 성취하려는 것을 명시하십시오. – Ike10
Objc에서 선택 항목이 문제가 될 수 있습니다. 당신이 할 수있는 일은 각각 특정 목적을 위해 여러 대의 델리게이트를 설정하는 것입니다. 델리게이트가 설정되지 않았다면 관련 함수가 호출되지 않습니다. – Feldur
@ Ike10 질문을 바로 업데이트했습니다 : – farzadshbfn