swift4.2升级的那些事

910 阅读2分钟

最近公司项目升级到 swift4.2,其中的修改点,分享给也需要升级的小伙伴.

1. 表达式的拆分

以前表达式赋值的复杂和长度不受限制, 升级后,太复杂的表达式会直接报错.注意是报错而不是报warning, 也就是说必须不能使用太复杂的表达式.

如以前可以这样写:

但是在swift4.2里面句就会报错,调查下来发现self.parameters!.headLineNumber * fontHeight.headFontHeight这样的计算作为表达式的一部分就会报错.但是如果把这句改成 2 * 3这样的直接表达式就可以正常编译.所以小伙伴们写这样的赋值式如果使用到取值预算需要拆分来写.

2.UIAccessibilityTraints的赋值修改

因为项目支持UIAccessibility,以前viewaccessibilityTraits属性赋值selected可以这样写:

self.onJobImageView.accessibilityTraits |= UIAccessibilityTraits.selected

但是在swift4.2里面句就会报错, 是因为UIAccessibilityTraits属性类型发生改变,原来是UInt64, 现在是个struct, 不能直接做|=操作, 改成:

let accessibilityTraits = self.onJobImageView.accessibilityTraits.rawValue | UIAccessibilityTraits.selected.rawValue
self.onJobImageView.accessibilityTraits = UIAccessibilityTraits(rawValue: accessibilityTraits)

3. @objc的添加

升级到swift4.2后,所有OC访问swift的变量和函数都需要加上@objc,否则会提示warning

4.String(describing:)

升级后除String(不包括String!String?)类型的使用format格式的数据都需要使用String(describing:)进行转换,否则会报warning 如:

按照提示修复warning

使用插值器

当然也可以偷懒,用一些其他的写法来避免看到这重复的describing

[juejin.cn/post/684490…]

5. NSArray的类型处理

在swift中,NSArray需要定义具体类型,如果是从OC转换过来的,在调用的时候需要转成[Any], 在swift4.2之前系统会自动提示给我们加上强转 xxx as! [Any], 但是在swift4.2中如果强转会提示warning, 告诉我们

解决方式是按照提示Fix即可: xxx as? [Any]

6.UIImagePickerControllerdelegate处理

升级前

if let image = info[UIImagePickerControllerOriginalImage] {
}

升级后

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
     // Local variable inserted by Swift 4.2 migrator.
     let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)
     if let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] { 
     }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
	return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
	return input.rawValue
}

info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey)] 没有任何意义。你正在指定整个枚举类型。InfoKey而不是特定的价值,例如:

info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] 它可能也可以写成: info[.originalImage] as! UIImage

7. .substring(to: Index)

iOS10上编译, 使用substring(to:会报warning, 这个函数被deprecated 取代方法为:

let orign: String = "aaabbbbccccc"
let endIndex = orign.index(orign.endIndex, offsetBy: -3)

let sub1 = orign.substring(to: endIndex)  // 被 deprecated in swift4.2
let sub = String(orign[..<endIndex])      // 取代写法

let sub3 = orign.substring(from: endIndex) // 被 deprecated in swift4.2
let sub2 = String(orign[endIndex...])      // 取代写法