swift - 在 swift 4 中调配方法

标签 swift swift4 swizzling method-swizzling

<分区>

Swizzling 在 Swift 4 中不再有效。

方法 'initialize()' 定义了 Objective-C 类方法 'initialize',这是 Swift 不允许的

这是我找到的解决方案,所以想把问题和答案留给其他人。

最佳答案

initialize() 不再公开:Method 'initialize()' 定义了 Objective-C 类方法 'initialize',这是 Swift 不允许的

所以现在的方法是通过公共(public)静态方法运行您的 swizzle 代码。

例如

在扩展中: (该扩展用于kickstarted开源代码: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 */
    }
}

在应用委托(delegate)中: (kickstarted开源代码中使用了该方法:https://github.com/kickstarter/ios-oss/blob/7c827770813e25cc7f79a28fa151cd713efe936f/Kickstarter-iOS/AppDelegate.swift#L33)

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
}

关于swift - 在 swift 4 中调配方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46361065/

相关文章:

ios - 问题注意 Swift 方法作为 Objective C 中的选择器并在 Swift ios App 中使用 Objective C 对象

swift - Swift 4 中的冗余一致性约束警告

objective-c - 如何从 Objective-C 调用使用 class_getInstanceMethod 保存的方法?

objective-c - 可以使用 Class 对象来转换 Objective-C 对象吗?

ios - 使用复选框制作自定义 TableviewCell

ios - 关闭 viewController 总是触发 viewDidLoad 并且从不触发 viewWillAppear

swift - 找不到架构 'SJSegmentedScrollView' 的模块 'armv7' ;发现: arm64

swift - 为什么 Swift 给出的浮点运算结果不准确?

swift - 在 Swift 中使属性符合类型并且也符合协议(protocol)

ios - 适用于 iOS 的 Firebase 云消息传递通知未显示已打开和分析