欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xcode项目中不同Swift版本导致的问题

程序员文章站 2024-03-24 08:42:22
...

你会问同一个Xcode项目中还会用不同版本的Swift?

对!举个栗子:2年前你写了一个管理密码的App,最近你觉得有必要再写一个Today Widget插件用来便捷显示密码。

之前的代码Swift版本是3.2(假设),而最新的Widget则使用4.0

为什么不把3.2的代码升级到4.0呢?这是可以的,但是涉及到要改很多地方:

Xcode项目中不同Swift版本导致的问题


而且3.2和4.0也不是完全不兼容,只是在某些地方新旧版本会有冲突,没必要为了这一点兼容性而老项目全部升级版本。

比如说对于NSMutableAttributedString的操作,4.0之后对于属性名称的引用方式和之前有不同,无法写出3.2和4.0都能编译通过的代码。

对于3.2和4.0都会引用到的代码片段,我们必须因”版”而异,用Swift的编译宏命令做代码隔离:

#if swift(>=4.0)
            attrString.addAttribute(.foregroundColor, value: UIColor.red, range: range)
            attrString.addAttribute(.backgroundColor, value: UIColor.green, range: range)
            attrString.addAttributes([.shadow:keywordShadow,.verticalGlyphForm:0], range: range)
        #else
            attrString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: range)
            attrString.addAttribute(NSBackgroundColorAttributeName, value: UIColor.green, range: range)
        attrString.addAttributes([NSShadowAttributeName:keywordShadow,NSVerticalGlyphFormAttributeName:0], range: range)
        #endif

以上代码在项目的公共组里的String+ext.swift文件中,该文件会同时被App和Widget项目包含使用。

使用如上所示的代码隔离,或称为选择编译使得全部项目顺利编译通过。