转载

Swift 3.0.1 的两个小改动:SE-139,SE-140

原文

3.0.1中主要有三个新feature:SE-138,SE-139,SE-140

SE-138:新增两个底层指针类型

标准库增加了两个指针类型:UnsafeRawBufferPointer 和 UnsafeMutableRawBufferPointer 。具体使用可以参照: UnsafeRawPointer Migration Guide 。在某些场景下使用UnsafeRawBufferPointer替代 UnsafeBufferPointer 会安全的多。对于处理二进制和I/O流有很大帮助。

SE-139:所有数据类型在OC中使用时映射为NSNumber

原先只有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.

SE-140:Optional 类型转为Any时警告是否要解包

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)

会有警告:

Swift 3.0.1 的两个小改动:SE-139,SE-140

会警告需要进行解包。

如果你本来就是要这样的行为,需要显示的类型转换为Any

mutalArray.add(x as Any)
原文  http://www.cocoachina.com/swift/20161231/18491.html
正文到此结束
Loading...