原文
3.0.1中主要有三个新feature:SE-138,SE-139,SE-140
标准库增加了两个指针类型:UnsafeRawBufferPointer 和 UnsafeMutableRawBufferPointer 。具体使用可以参照: UnsafeRawPointer Migration Guide 。在某些场景下使用UnsafeRawBufferPointer替代 UnsafeBufferPointer
原先只有Int、UInt和Double映射到OC时会被映射为NSNumber,其他数据类型比如UInt8则不会。
现在统一把Swift中所有的数据类型都映射为NSNumber:
Int8
Int16
Int32
Int64
UInt8
UInt16
UInt32
UInt64
Float
Double
Cocoa 中结构体支持转换成NSValue的映射时全都转为NSValue:
NSRange
CGPoint
CGVector
CGSize
CGRect
CGAffineTransform
UIEdgeInsets
UIOffset
CATransform3D
CMTime
CMTimeRange
CMTimeMapping
MKCoordinate
MKCoordinateSpan
SCNVector3
SCNVector4
SCNMatrix4
这对于原来Cocoa中一些本来就要求NSValue的属性提供了很大的便利。比如CAKeyframeAnimation中的values属性:
Depending on the type of the property, you may need to wrap the values in this array with an NSNumber of NSValue object. For some Core Graphics data types, you may also need to cast them to id before adding them to the array.
OC中的id类型对应Swift中的Any。原来在Optional类型转换为Any后,OC中方法声明的nonnull id检查不会生效。因为已经是一个Any的值了,虽然这个值里面包的是一个nil。这也带来了潜在的危险。所以现在对于原来OC中的参数要求是nonnull id类型,对于Optional会进行解包警告。
比如这样的代码:
let x: Int? = 3 let mutalArray = NSMutableArray() mutalArray.add(x)
会有警告:
会警告需要进行解包。
如果你本来就是要这样的行为,需要显示的类型转换为Any
mutalArray.add(x as Any)