将显式展开的枚举类型的属性与常量进行比较

时间:2015-07-16 03:22:57

标签: swift enums optional

我有一个像这样的枚举:

enum MyEnumType{
case Case1
case Case2
}

以及如下定义的属性:

var myProperty:MyEnumType!

...声明为可选类型,因为我的代码逻辑要求只能在实例初始化后设置

在我的一个方法中,我试图将属性与类型的预设值(个案)之一进行比较,如下所示:

if myProperty == .Case1 {
    // some code
}

然而,编译器抱怨:

  

找不到会员" Case1"

...直到我将!添加到变量中,如下所示:

if myProperty! == .Case1 {
    // some code
}

有意义的是.Case1类型中没有memebr MyEnumType!(可选):.Case1它是MyEnumType类型的值(非可选 - 技术上他们是两种不同的类型)。

然而,如果我仍然需要附加!,那么在声明中使用显式展开的可选(?而不是!)有什么意义(即方便)?当我访问它时?

编辑:我只需要在比较中!附加==。例如,以下(赋值)代码编译没有问题:

myProperty = .Case1

编辑2:好的,所以这里是实际的类型名称/变量名称(它不是机密或任何东西)只是为了确保我没有改变任何适应的问题:

类型:

enum OrderingDirection : Printable {    
    case Ascending
    case Descending

    var description: String {
        switch self {
        case .Ascending:
            return "Ascending"    
        case .Descending:
            return "Descending"
        }
    }
}

这是我班的财产声明:

var orderDirection:OrderingDirection!

...这里是if块,我尝试将明确解开的可选项与其中一种类型的案例进行比较:

if orderDirection! == .Ascending { // Compiler error if I omit the "!"
    orderDirection = .Descending
}
else{
    orderDirection = .Ascending
}

(我正在切换价值)

编辑3:根据@ user2194039的建议,我在比较中尝试了省略枚举类型:我替换了

if orderDirection == .Ascending {

使用:

if orderDirection == OrderingDirection.Ascending {

...现在错误消失了(不再需要展开{​​{1}})。另外,无论如何添加!都不会产生任何警告。

编辑4:为了确保,我创建了一个新项目,iOS单一View Application(Universal,Swift)。我将包含的视图控制器子类修改为以下内容:

!

...而且,与我的实际项目不同,不会报告编译器错误。在我的代码中必须与其他实体进行一些相互作用,但是现在我无法弄清楚它可能是什么。

编辑5:(进一步考虑)followind 编译:

import UIKit

enum OrderingDirection : Printable {

    case Ascending
    case Descending

    var description: String
        {
            switch self {
            case .Ascending:
                return "Ascending"

            case .Descending:
                return "Descending"
            }
    }
}


class ViewController: UIViewController {

    var orderDirection:OrderingDirection!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        if orderDirection == .Ascending { // <- No "!", yet no error

        }
        else{

        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

以下,

if orderDirection as OrderingDirection == .Ascending {

1 个答案:

答案 0 :(得分:1)

如果替换

,是否仍会出现编译错误
if orderDirection! == .Ascending {...}

if orderDirection == OrderingDirection.Ascending {...}

试试看?注意我从比较中删除了!并指定了OrderingDirection枚举以及特定情况。

如果这确实消除了错误,那么编译器的混淆必定有一些原因。您是否有一个名为Ascending的案例的Enum? Enum是框架或库的一部分吗?