2017-08-10 219 views
2

我在我的项目中发现了一个有趣的代码,我在想它甚至是如何工作的。如果我把它简化,在操场它看起来像这样:Swift使用“as”操作符将Bool转换为NSNumber

var b: Bool = true 
var n: NSNumber = b as NSNumber 

我不明白为什么as运营蒙上BoolNSNumberas的文档给出了使用它的唯一示例,即检查[Any]数组中元素的类型。这是从文档的例子,这是我没有料到as使用:

var things = [Any]() 
for thing in things { 
    switch thing { 
    case 0 as Int: 
    case 0 as Double: 

没想到as做实型铸造。我在哪里可以阅读更多关于它的内容 当我试着使用Int代替NSNumber相似的代码,它不会编译:

var b: Bool = true 
var n: Int = b as Int --> doesn't compile 

所以NSNumber似乎是一个特例?我很困惑。任何人都可以阐明这一点吗?

回答

5

as运算符可用于两种类型的铸造。类型铸造和桥梁铸造。类型转换可用于将子类转换为超类(称为向上转换)或将超类向下转换为子类(仅当子类实例上传时才起作用)。这就是你在Any阵列中看到的例子。

然而,桥梁铸造是为了更容易在FoundationSwift类之间的互操作性而提供的机制。 NSNumber有一个init方法,它将一个Bool作为其输入参数。该as运营商在你的例子调用此初始化,所以

var b: Bool = true 
var n: NSNumber = b as NSNumber 

仅仅是

var b:Bool = true 
var n = NSNumber(value: b) 

IntBool一个速记符号都是Swift类型,所以桥铸造不会对他们的工作。请参考documentation of NSNumber

2

Working with Cocoa Frameworks(强调):

编号NSNumber类和夫特数字类型之间

夫特桥,包括IntDouble,和Bool

您可以使用as运算符通过施加Swift数字值来创建NSNumber对象。因为NSNumber可以包含各种不同的类型,所以在转换为Swift数字类型时必须使用as?运算符。

0

根据苹果文档的NSNumber可以与下面的数据类型,因此可以类型强制转换到他们以及初始化: -

open class NSNumber : NSValue { 

     public init?(coder aDecoder: NSCoder) 

     public init(value: Int8) 

     public init(value: UInt8) 

     public init(value: Int16) 

     public init(value: UInt16) 

     public init(value: Int32) 

     public init(value: UInt32) 


     public init(value: Int64) 

     public init(value: UInt64) 

     public init(value: Float) 

     public init(value: Double) 

     public init(value: Bool) 

     @available(iOS 2.0, *) 
     public init(value: Int) 

     @available(iOS 2.0, *) 
     public init(value: UInt) 


     open var int8Value: Int8 { get } 

     open var uint8Value: UInt8 { get } 

     open var int16Value: Int16 { get } 

     open var uint16Value: UInt16 { get } 

     open var int32Value: Int32 { get } 

     open var uint32Value: UInt32 { get } 


     open var int64Value: Int64 { get } 

     open var uint64Value: UInt64 { get } 

     open var floatValue: Float { get } 

     open var doubleValue: Double { get } 

     open var boolValue: Bool { get } 

     @available(iOS 2.0, *) 
     open var intValue: Int { get } 

     @available(iOS 2.0, *) 
     open var uintValue: UInt { get } 


     open var stringValue: String { get } 


     open func compare(_ otherNumber: NSNumber) -> ComparisonResult 


     open func isEqual(to number: NSNumber) -> Bool 


     open func description(withLocale locale: Any?) -> String 
    } 

所以下面所有的例子都是真实的: -

 let intValue : Int = 2 
     let floatValue : Float = 2.0 
     let boolValue : Bool = true 
     let doubleValue : Double = 2 

     let x = intValue as NSNumber 
     let y = floatValue as NSNumber 
     let z = boolValue as NSNumber 
     let a = doubleValue as NSNumber 
+1

初始化和铸造是不同的东西。你可以从一个整数初始化一个字符串:'String(123)',但是你不能将一个整数转换成一个字符串:'123 as String' –

+0

明白了你的观点.. –

相关问题