私はNakedNavigationBar
というプロトコルを持っています。Swift - メソッドスウィズリングを使用するプロトコルに準拠している場合にのみクラスを拡張する
NakedNavigationBar
に準拠するUIViewController
のすべてを拡張する拡張子もあります。
拡張機能では、UIViewController
が初期化されたときに、UIViewController
でメソッドスウィズルを使用するように、デフォルトの動作を追加したいという問題があります。
import UIKit
protocol NakedNavigationBar
{
}
extension NakedNavigationBar where Self: UIViewController
{
public override class func initialize()
{
struct Static
{
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token)
{
let originalSelector = #selector(viewWillAppear(_:))
let swizzledSelector = #selector(nakedNavigationBar_viewWillAppear(_:))
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
let didAddMethod = class_addMethod(self,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod))
if didAddMethod
{
class_replaceMethod(self,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod))
}
else
{
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
// MARK: - Swizzling Methods
func nakedNavigationBar_viewWillAppear(animated: Bool)
{
self.nakedNavigationBar_viewWillAppear(animated)
print("VWA Swizzling...")
// Hide the navigation bar
_setNavigationBarVisible(isVisible: false)
}
// MARK: -
private func _setNavigationBarVisible(isVisible isVisible: Bool)
{
// (Changes background and shadow image)
}
}
は、基本的にそれがUIViewController
メソッドを持っていないので、私は、プロトコルを拡張することができないことを私に言ってここ
where Self: UIViewController
は
UIViewController
でのみ動作し、ビューコントローラは
NakedNavigationBar
に適合する場合にのみ拡張するようにしてください。
はもともと拡張でしたextension UIViewController: NakedNavigationBar
が、これは私のUIViewController
秒のすべてが瞬時にNakedNavigationBar
ではなく、私が選択したものだけに準拠します。 3.0 SWIFTのよう
あなたのアプローチをコンパイルしてもうまくいかない場合でも。メソッドをスウィズルすることは、あなたのプロトコルに準拠したものだけでなく、すべての 'UIViewController'に影響します。 – dan
良い点:/あなたは仕事を考えていますか? –