我有一个像这样的枚举:
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 {
答案 0 :(得分:1)
如果替换
,是否仍会出现编译错误if orderDirection! == .Ascending {...}
带
if orderDirection == OrderingDirection.Ascending {...}
试试看?注意我从比较中删除了!
并指定了OrderingDirection
枚举以及特定情况。
如果这确实消除了错误,那么编译器的混淆必定有一些原因。您是否有一个名为Ascending
的案例的Enum? Enum是框架或库的一部分吗?