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

2017-02-28 04:59:02 +08:00
 lvlingsheng

如果想在 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 呢?

7160 次点击
所在节点    Apple
5 条回复
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
2017-02-28 23:57:55 +08:00
@CommandZi 哈,你的代码没有问题,但是如果在 Xcode8.3 中, IDE 会对你里面的 open override static func initialize()警告,我的问题就是有没有其他办法可以解决这个问题。
CommandZi
2017-03-01 11:40:31 +08:00
@lvlingsheng 其他的比如协议加协议扩展也是可以的,但是没有办法像 Method Swizzling 这样对代码无感知地更少侵入性地作修改操作。
关于那个警告,你可以像这里最后说的那样来消除警告: http://nshipster.cn/swift-objc-runtime/
> 在 app delegate 中实现方法交叉
hstdt
2017-03-01 12:45:24 +08:00
我觉得既然苹果都说了 swizzle 只能用于 oc ,那就把这部分东西写在 oc 文件里面,然后 bridge 引用,避免以后 swift 语法变化。
ywUXm9U86a62N7rN
2017-04-23 14:32:39 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343691

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX