kingcos / Perspective

📝 Write something with perspectives.
https://kingcos.me
185 stars 15 forks source link

Objective-C 与 Swift 桥接中的坑 #68

Open kingcos opened 5 years ago

kingcos commented 5 years ago

Preface

Optional 与 Nullability

Obj-C Usage Swift
nullable 可空 SomeClass?
nonnull 不可空 SomeClass
null_unspecified 未指定是否可空(默认 SomeClass!

NSNotificationNameNotification.Name

Swift 诞生即看重安全,而硬编码是代码中很难去保证安全性的一环。Swift 4.2 中的 Notification.Name 即通知名更改为更加安全的做法,而为了和 Obj-C 中的 NSNotificationName 可以兼容,需要在 Obj-C 中的声明后增加 NS_EXTENSIBLE_STRING_ENUM 宏。

  1. 在增加了 NS_EXTENSIBLE_STRING_ENUM 宏后,Swift 中可以使用类似枚举的语法;
  2. 为了 Swift 更简单的语法,如果类型名位于变量名开头,则需要在 Swift 中会忽略并以首字母小写形式使用,eg. NSNotificationNameDidUpdate -> .didUpdate
  3. 对于NSNotificationName,Obj-C 变量结尾含有 Notification,也会进行忽略,经过测试此条并不适用其他声明 NS_EXTENSIBLE_STRING_ENUM 的自定义类型,eg. DidUpdateNotification -> .DidUpdate
  4. 当同时满足 2 & 3,则会优先 3,eg. NSNotificationNameDidUpdateNotification -> .NSNotificationNameDidUpdate
  5. 需要注意因此可能会存在通知重叠的可能,eg. DidUpdateNotification & DidUpdate 在 Swift 中均为 .DidUpdate => Ambiguous use of 'DidUpdate'。