V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lvlingsheng
V2EX  ›  Apple

如何在 Swift 3.1 中 override initialize()方法?

  •  
  •   lvlingsheng · 2017-02-28 04:59:02 +08:00 · 6993 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果想在 Swift 中用 method swizzling ,原先的做法是需要重写 OC 中的 initialize 方法:

    open override static func initialize() { // Method Swizzling }

    但是在 Swift3.1 中,苹果不再建议在 swift 中 override initialize Method ,会提示: 'initialize()' defines Objective-C class method 'initialize', which is not guaranteed to be invoked by Swift and will be disallowed in future versions

    之前喵神在他的书的第二版里有提到 override initialize 方法来做 Method Swizzling , 但在第三版更新的时候删除了这部分内容,因为喵神觉得应该用更加 swift 化的方法来做。

    现在求问改怎么改或者怎么重写才能继续使用 Method Swizzling 呢?

    5 条回复    2017-04-23 14:32:39 +08:00
    CommandZi
        1
    CommandZi  
       2017-02-28 13:01:08 +08:00
    没人答,我来班门弄斧一下。
    先贴 Gist 地址: https://gist.github.com/chn-lyzhi/6056f3ef48d997629b438254c67d781c
    代码应该很清楚了,我这里是 Swift 3 下使用 Objective-C Runtime 里的 Method Swizzling 方法来做页面统计。你可以根据自己的需求改写。
    lvlingsheng
        2
    lvlingsheng  
    OP
       2017-02-28 23:57:55 +08:00
    @CommandZi 哈,你的代码没有问题,但是如果在 Xcode8.3 中, IDE 会对你里面的 open override static func initialize()警告,我的问题就是有没有其他办法可以解决这个问题。
    CommandZi
        3
    CommandZi  
       2017-03-01 11:40:31 +08:00
    @lvlingsheng 其他的比如协议加协议扩展也是可以的,但是没有办法像 Method Swizzling 这样对代码无感知地更少侵入性地作修改操作。
    关于那个警告,你可以像这里最后说的那样来消除警告: http://nshipster.cn/swift-objc-runtime/
    > 在 app delegate 中实现方法交叉
    hstdt
        4
    hstdt  
       2017-03-01 12:45:24 +08:00 via iPhone
    我觉得既然苹果都说了 swizzle 只能用于 oc ,那就把这部分东西写在 oc 文件里面,然后 bridge 引用,避免以后 swift 语法变化。
    shuoit
        5
    shuoit  
       2017-04-23 14:32:39 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1378 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 23:41 · PVG 07:41 · LAX 16:41 · JFK 19:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.