Swift 类型转换
整数类型之间的转换
//整形数据之间相互转换
func numericCast<T, U>(T) -> U
实例代码如下:
let val: Int = 10
arc4random_uniform(numericCast(val))
arc4random_uniform(UInt32(val))
相比numericCast与使用整数类型的构造方法来转换需要得到的相应类型的好处显而易见了,我们不需要再管它到底是什么类型,只要他们都实现了BinaryInteger接口,就可以互相转换,因为这个接口定义了构造方法用于构造并实现相互转换的功能
init<T>(_ source: T) where T : BinaryInteger
更优雅的解决了整数之间频繁的转换操作
临时生成一个Escaping Closure
func withoutActuallyEscaping<ClosureType, ResultType>(ClosureType, do: (ClosureType) -> ResultType) -> ResultType
当一个函数的参数是一个closure并且是一个no esacping,调用closure是一个异常操作时就可以使用这个方法来临时生成一个esacping
AnyObject之间的转换
在Objective-C中要显式的转换类型使用(U *)instance
在Swift转换的时候使用as 来显示的转换,来看看:
let obj: NSObject = NSString.init(string: "007")
let name: NSString = obj as! NSString
这样转换是无可厚非的,但是看起来有点啰嗦。
func unsafeDowncast<T>(_ x: AnyObject, to type: T.Type) -> T where T : AnyObject
可以帮我们优雅的解决这个问题,正如:numericCast一样,看起来更优雅方便了
let obj: NSObject = NSString.init(string: "007")
//let name: NSString = obj as! NSString
let name: NSString = unsafeDowncast(obj, to: NSString.self)
如果我们需要在调用函数的时候使用就更优雅了,看看:
//改造一下
func _unsafeDowncast<T>(_ x: AnyObject) -> T where T: AnyObject {
return unsafeDowncast(x, to: T.self)
}
let obj: NSObject = NSString.init(string: "007")
func updateName(_ name: NSString) {
}
updateName(obj as! NSString)
updateName(_unsafeDowncast(obj))
任意类型之间的转换
//看上去不是太安全
func unsafeBitCast<T, U>(_ x: T, to type: U.Type) -> U