このコードはコンパイルされず、まるで愚かに聞こえるかもしれませんが、なぜそれが重要なのかを説明します!@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使用することはできません(どちらかこのシナリオでローミングサービスをしない)ので、それはおそらくです。しかし、次の例を考えてみます。
私は私の延長にあるプロトコルで定義された非任意の方法(私は@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