交换机中隐式解包的Optionals

时间:2014-06-27 14:45:47

标签: ios swift

在Playground会话期间,我在switch语句中使用Implicitly Unwrapped Optionals时发现奇怪错误。

我已宣布Barcode枚举:

enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}

并做了一些尝试......

首先尝试(工作)

第一次尝试使用非可选变量定义

var productCode : Barcode

productCode = Barcode.QRCode("ABCDEFGHIJKLMNOP")

// Working
switch productCode {
case .UPCA(let system, let identifier, let check):
    println("UPC-A with value of \(system)-\(identifier)-\(check)")
case .QRCode(let code):
    println("QRCode with value of \(code)")
}

使用以下控制台输出可以

  

QRCode,其值为ABCDEFGHIJKLMNOP

第二次尝试(不工作)

第二次尝试使用 Implicitly Unwrapped Optional

var productCode : Barcode!

productCode = Barcode.QRCode("ABCDEFGHIJKLMNOP")

switch productCode {
// Error1
case .UPCA(let system, let identifier, let check):
    println("UPC-A with value of \(system)-\(identifier)-\(check)")
// Error2
case .QRCode(let code):
    println("QRCode with value of \(code)")
}

失败并出现以下错误

Error1: Enum case pattern cannot match values of the non-enum type 'Barcode!'
Error2: Enum case pattern cannot match values of the non-enum type 'Barcode!'

修改后的第二次尝试(工作)

要使其工作,我必须打开 productCode,如下所示

var productCode : Barcode!

productCode = Barcode.QRCode("ABCDEFGHIJKLMNOP")

switch productCode! {
case .UPCA(let system, let identifier, let check):
    println("UPC-A with value of \(system)-\(identifier)-\(check)")
case .QRCode(let code):
    println("QRCode with value of \(code)")
}

Aren的隐式解包选项应该在没有解包运算符的情况下访问值吗?

为什么第二次尝试失败使用productCode,一个隐式解包的可选变量,而不打开它?

我错过了一些明显的东西吗?

提前致谢。

0 个答案:

没有答案