Swift 4でのスウィズリングは機能しなくなりました。
Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift
これは私が解決策を見つけたので、質問を残して他の人に答えたいと思ったものです。
initialize()は公開されなくなりました:Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift
したがって、今それを行う方法は、パブリック静的メソッドを介してスウィズルコードを実行することです。
例えば
拡張機能で:(この拡張機能はキックスタートされたオープンソースコードで使用されます: https://github.com/kickstarter/ios-oss/blob/master/Library/DataSource/UIView-Extensions.Swift )
private var hasSwizzled = false
extension UIView {
final public class func doBadSwizzleStuff() {
guard !hasSwizzled else { return }
hasSwizzled = true
swizzle(self) /* This is pseudo - run your method here */
}
}
アプリデリゲート内:(このメソッドはキックスタートされたオープンソースコードで使用されます: https://github.com/kickstarter/ios-oss/blob/7c827770813e25cc7f79a28fa151cd713efe936f/Kickstarter-iOS/AppDelegate.Swift#L =)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
UIView.doBadSwizzleStuff()
}
別の方法は、シングルトンを使用することです。
extension UIView {
static let shared : UIViewController = {
$0.initialize()
return $0
}(UIViewController())
func initialize() {
// make sure this isn't a subclass
guard self === UIViewController.self else { return }
let swizzleClosure: () = {
UIViewController().swizzle() /* This is pseudo - run your method here */
}()
swizzleClosure
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
_ = UIViewController.shared
}