2017-09-22 97 views
3

Swiftling在斯威夫特4不再有效。方法在swift 4迅速4

Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift

這是我已經找到了解決方案,所以想離開的問題和回答別人。

回答

3

初始化()不再暴露: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#L33

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: UIApplicationLaunchOptionsKey: Any]?) -> Bool 
{ 
    UIView.doBadSwizzleStuff() 
} 

另一種方法是使用一個單例:如果你有機會到AppDelegate的源代碼

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 
} 
+0

這僅適用。我正在編寫一個庫,並希望利用Swizzling在ViewController的「viewDidLoad」塊中運行特定的方法。我試圖讓我的庫儘可能容易地讓客戶實現,雖然我可以讓他們向AppDelegate添加代碼,但如果可能的話,我寧願使用Swizzling(如果需要,可以選擇禁用它)。任何關於這個獲得「AppDelegate-free」Swift在Swift 4.0中工作的想法?謝謝! Craig – CPR

+1

我看到了一些代碼(我不記得鏈接,如果我再次發現會發布)。但他們否認UIResponder我認爲,然後從那裏調用doBadSwizzle()方法,允許他們沒有訪問AppDelegate的工作。 我不確定具體的實施細節了 –

+1

我想你是指這個職位:http://jordansmith.io/handling-the-deprecation-of-initialize/。我正在他的博客上與喬丹進行討論,所以如果您有任何補充,請隨時加入。謝謝! – CPR