siwft3.0转4.0开发中遇到的坑

我们以斗鱼APP为例,总结swift3.0以及swift4.0转换过程中遇到的问题。

一、方法重写问题

1、swift 3.0在子类中的方法重写

我们RecommendVC类继承自BaseAnchorVC,BaseAnchorVC中包含setupUI方法,然后再子类RecommendVC的继承中重写setupUI方法,这样是没有问题的。

extension RecommendVC {
    override func setupUI(){
        //调用父类方法
        super.setupUI()
        collectionView.addSubview(cycleView)
        collectionView.addSubview(gameView)
        //拓宽collectionView的高度
        collectionView.contentInset = UIEdgeInsets(top: kCycleViewH+kGameViewH, left: 0, bottom: 0, right: 0)
    }
}

2、swift4.0方法的重写

在swift4.0方法中不可使用这种方法重写,否则会报错。如下图所示:


swift4.0在子类中重写方法错误

由于无法重写方法,所以我们目前就不重写父类方法,而是重新给子类定义一个方法使用。

二、KVC自动赋值问题

1、在swift3.0中,我们从服务器获取数据之后,进行字典转模型,然后使用KVC自动赋值。

注意:由于使用了KVC自动赋值,在项目中极有可能出现我们模型中没有定义的key导致的崩溃导致的崩溃,所以我们重写func setValue(_ value: Any?, forUndefinedKey key: String) 方法,防止崩溃。

class CycleModel: NSObject {
    var title : String = ""
    var pic_url : String = ""
    var anchor : AnchorModel?
    //didSet自动监控值的变化,使用guard进行检验
    var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }    
    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    //防止在KVC赋值时有找不到key导致的崩溃
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

2、在swift4.0中,直接这样使用无效。

我们必须在属性前添加@objc,只有这样才能满足OC的KVC赋值。

class CycleModel: NSObject {
    @objc var title : String = ""
    @objc var pic_url : String = ""
    @objc var anchor : AnchorModel?
    @objc var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }

    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }

    override func setValue(_ value: Any?, forUndefinedKey key: String) {

    }
}
@objc知识扩展
  • @objc 作用
    1、fileprivate 或者 private 保证方法私有 能在同一个类 或者 同一个文件(extension)中访问这个方法 如果定义为private 那么只能在一个类中访问 不能在类扩展中访问。
    2、允许这个函数在“运行时”通过oc的消息机制调用。比如上面的KVC赋值属性就必须使用@objc。

三、swift中的@objc的作用

swift为静态语言,每个函数在编译期间就可以确定。因此在编译完成后可以检测出没有被调用到的swift函数,优化删除后可以减小最后二进制文件的大小。相较于OC是一个杀手级的特性。

那么,为什么OC没有这个特性嫩?

那是因为OC是动态语言,调用函数是在运行时通过发送消息调用的。所以在编译期并不知道这个函数是否调用到,所以全部的方法都会保留。

  • 混合开发中的问题
    swift中的函数怎么知道是否被OC调用了呢?
    出于安全起见,只能保留所有有可能会被OC调用的swift函数,然后标记为@objc。

在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另外一种方式:继承 NSObject。class 继承了 NSObject 后,编译器就会默认给这个类中的所有函数都标记为 @objc ,支持 OC 调用。然而在实际项目中,一个 swift 类虽然继承了 NSObject,但是其中还是有很多函数不会在 OC 中被调用,这里有很大的优化空间。于是根据 SE160 的建议,苹果修改了自动添加 @objc 的逻辑:一个继承 NSObject 的 swift 类不再默认给所有函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。

XCode 9会在运行过程中自行检测类中函数是被 OC 调用,然后提示添加 @objc。下图中的 vc 是 swift 中的类,showStatus 也是 swift 函数,现在编译器会提示需要手动添加 @objc:

斗鱼github
学习资料
swift调用OC的作用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 1.提取图片 [D 160418 15:31:06 connectionpool:383] "POST /math...
    潇湘阳阳阅读 810评论 2 0
  • 微信小程序游戏类demo:识色;从相似颜色中挑选不同的一个源码链接:http://www.wxapp-union....
    神木惊蛰阅读 3,984评论 0 6
  • 今天就要教给大家一个健康生活必备技能——学会看食物包装上的营养标签。 1.营养标签 在我国,从2013年1月1日施...
    猴得柱阅读 545评论 0 2
  • 海风徐徐而来,红灯笼随风摇摆,荡漾在街道中,偶有炮竹声打破夜的宁静,在星空下绚丽绽放,才让人记得,现在正式2015...
    洋泡泡阅读 912评论 2 17
  • 毕业大半年了,工作过两三个月,发现自己还是喜欢学习。于是辞去了销售助理的工作,在培训机构学软件。 刚从...
    craky偷书贼阅读 107评论 0 0