栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何实现swift swift 3.0的方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何实现swift swift 3.0的方法?

首先,

dispatch_once_t
在Swift 3.0中不可用。您可以选择两种选择:

  1. 全局变量

  2. 静态财产

    struct
    enum
    class

对于不同的目的,您必须使用不同的实现方式

  • 令人毛骨悚然的CocoaTouch类,例如UIViewController;
  • 定制的Swift类;

令人毛骨悚然的CocoaTouch类

例如混写

viewWillAppear(_:)
UIViewController
使用全局变量

private let swizzling: (UIViewController.Type) -> () = { viewController in    let originalSelector = #selector(viewController.viewWillAppear(_:))    let swizzledSelector = #selector(viewController.proj_viewWillAppear(animated:))    let originalMethod = class_getInstanceMethod(viewController, originalSelector)    let swizzledMethod = class_getInstanceMethod(viewController, swizzledSelector)    method_exchangeImplementations(originalMethod, swizzledMethod) }extension UIViewController {    open override class func initialize() {        // make sure this isn't a subclass        guard self === UIViewController.self else { return }        swizzling(self)    }    // MARK: - Method Swizzling    func proj_viewWillAppear(animated: Bool) {        self.proj_viewWillAppear(animated: animated)        let viewControllerName = NSStringFromClass(type(of: self))        print("viewWillAppear: (viewControllerName)")    }  }

自定义Swift类

要对Swift类使用方法混乱,必须满足两个要求(有关更多详细信息):

  • 包含要混淆的方法的类必须扩展
    NSObject
  • 您想要混淆的方法必须具有
    dynamic
    属性

自定义Swift基类的示例混淆方法

Person

class Person: NSObject {    var name = "Person"    dynamic func foo(_ bar: Bool) {        print("Person.foo")    }}class Programmer: Person {    override func foo(_ bar: Bool) {        super.foo(bar)        print("Programmer.foo")    }}private let swizzling: (Person.Type) -> () = { person in    let originalSelector = #selector(person.foo(_:))    let swizzledSelector = #selector(person.proj_foo(_:))    let originalMethod = class_getInstanceMethod(person, originalSelector)    let swizzledMethod = class_getInstanceMethod(person, swizzledSelector)    method_exchangeImplementations(originalMethod, swizzledMethod)}extension Person {    open override class func initialize() {        // make sure this isn't a subclass        guard self === Person.self else { return }        swizzling(self)    }    // MARK: - Method Swizzling    func proj_foo(_ bar: Bool) {        self.proj_foo(bar)        let className = NSStringFromClass(type(of: self))        print("class: (className)")    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368480.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号