Swift 4 迁移踩坑

文档
  1. private 属性作用域扩大到 extension , 防止 fileprivate 的滥用

  2. 可以把类型和协议用 & 组合在一起作为一个类型使用,优化代码结构

  3. Associated Type 可以追加 Where 约束语句

  4. keyPath:

    Swift 3

    let barKeyPath = #keyPath(Foo.bar)
    var bar = foo.value(forKeyPath: barKeyPath)
    foo.setValue("BAR", forKeyPath: barKeyPath)
    
    

    Swift 4

    let barKeyPath = \Foo.bar
     var bar = foo[keyPath: barKeyPath]
     foo[keyPath: barKeyPath] = "BAR"
    

    swift 4: 更安全,控制 value 的 anyObject 类型,并且不需要类继承 NSObject

  1. 下标支持泛型

  2. 以及一些系统优化: unicode count 计算,字符串处理速度

  3. String.Charactor.startIndex -> String.startIndex 去掉 charactor 中间属性,直接取 string 的属性

  4. String 当做 Collection 来用(即 String 拥有 Collection 的属性) eg: string.reversed() string.filter string.map …

  5. 多行字符串字面量,省去繁琐换行操作

     let joke = """
        Q: Why does \(name) have \(n) \(character)'s in their name?
        A: I don't know, why does \(name) have \(n) \(character)'s in their name?
        Q: Because otherwise they'd be called \(punchline).
        """
    
  6. Encoding and Decoding

    让归档更简单只能, 继承 Codeable 协议的对象都可 实现 let encoded = try? JSONEncoder().encode(swift) 将 对象归档为Data,相反解档


看完文档,正式开始

迁移顺序

  • 第一步: 自动迁移。按照 Xcode 9 提示,选择 automatic mergation
    注意:
    (1) 当一个 workSpace 中有多个 target , 优先迁移多个 target,。有错误先不要着急改,等自动迁移完成后再一步步改错,否则改动会导致迁移其他 target 出错。
    (2) 如果用 cocoapods 管理的第三方库,自动迁移的时候会提示选择需要迁移的 framework, 因为 Swift 4.0 是兼容 Swift 3.2 的,考虑到有些第三方库没有及时迁移到 4.0 ,所以此时可以不勾选第三方库的迁移选项,仅迁移当前项目即可。

  • 第二步: 更新升级项目 config

  • 第三步: 修改 error, 项目不会一次性显示所有 error ,每次改完编译会出新 error

  • 第四步: 最后再修改 warning


Error
  1. 报错 Ambiguous reference to member '+' + 号表达不明确,将表达式拆分

  2. accesses to 0x7f887f904430, but modification requires exclusive access 可能会有多个原因,如果是 KVO 报此错误,是因为 Swift 4 使用了新的 KVO 方法。 参照 Swift 新的 KVO 方法
    或: github 实例

    // MARK: - Property
    
    fileprivate var _observation: NSKeyValueObservation?
    
    
    //MARK: - Lifecycle
    
    _observation = LCKXMPPActivity.sharedInstance.observe(\.status,   options: [.initial, .old]) { (child, change) in
         //
     }
    

statusLCKXMPPActivity 中声明为 @objc dynamic 的属性

@objc open dynamic var status: LCKXMPPStatus

遇到一个很很很奇怪的问题, _observation 对象如果不声明为全局的话, observe 方法并不会被 status 的的改变而触发

  1. 属性字符串 NSAttriburedString
Swift 3

   let attributes = [NSStrikethroughStyleAttributeName : NSUnderlineStyle.styleSingle.rawValue,
   NSForegroundColorAttributeName: UIColor.kTitleColor4] as [String : Any]

Swift 4

   let attributes: [NSAttributedStringKey: Any] =  [NSAttributedStringKey.strikethroughStyle: NSUnderlineStyle.styleSingle.rawValue,
   NSAttributedStringKey.foregroundColor: UIColor.kTitleColor4]     

attributedStringkey 统一通过 NSAttributedStringKey 调用,并且 NSAttributedString(string: <#T##String#>, attributes: <#T##[NSAttributedStringKey : Any]?#>) 接受的类型是 [NSAttributedStringKey : Any] 类型

warning
  1. swap(&a, &b) --> swapAt(Index:Int, Index: Int)

  2. init(colorLiteralRed:green:blue:alpha:) --> init(red:green:blue:alpha:)

  3. redundant conformance of XXX to protocol YYY 协议声明重复,查看当前所继承的协议是否有重复,或者查看子类是否又继承了一遍

  4. The use of Swift 3 @objc inference in Swift 4 mode is deprecated.
    首先在设置里如图所示:

    inference.png

    Swift 4 中不再默认[推断]为 OC 的方法加上 @objc 属性,所以需要 swift 调用 OC 的地方手动加上 objc.
    参见资料: stackoverflow evgenii

  5. Multiple Closures with Trailing Closure Violation: Trailing closure syntax should not be used when passing more than one closure argument. (multiple_closures_with_trailing_closure)

    warning: 
    
    ObjectiveManager.shared.finishObjective(objectiveID: "2", keyResults: [], success: {
          //
        }) { _ in
          //
        }
    
    success:
    
    ObjectiveManager.shared.finishObjective(objectiveID: "2", keyResults: [], success: {
      //
    }, failure: { _ in
      //
    })
    

    尾随闭包的问题,参见资料: Apple

  6. Declarations in extensions cannot override yet
    override 用户添加新方法,但不能修改原方法,所以讲 override 的方法不能放在 extension 中. 父方法前加 @objc

  7. This block declaration is not a prototype
    修改 strict prototypes set no 或者 OC 的 block 一个一个慢慢改吧,这里是混编 OC 的问题。
    参照资料 stackoverflow

  8. 当 OC 调用 swift 时报错 No known class method for selector 所调用的方法前加 @objc

  9. 'substring(from:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator.
    Stringsubstring属性在 Swift 4 新的实现

    let newStr = str.substring(to: index) -->  let newStr = String(str[..<index])
    

如果是某一范围 str[..<str.index(str.startIndex, offsetBy: 8)]
参照资料: stackoverflow

  1. tableview height for header & footer 不调用, 因为estimatedSectionHeaderHeight 在 iOS 11 不再有默认值。解决方案: 设置 tableview.estimatedSectionHeaderHeight = 0 或者
    实现 viewForFooterInSection 代理返回 nil, footer 同理

有些问题可能忘写了,以及不清楚的地方请留言讨论

持续更新,可以收藏关注先。。。

下一篇 iOS 11 以及 iPhone X 适配(11 已完成, X 还在挣扎中)

最后

写这篇博客的时候,并没有女朋友喂我水果吃 = =

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

推荐阅读更多精彩内容