【问题标题】:how to make switch case of enum case (swift)如何制作枚举案例的开关案例(swift)
【发布时间】:2014-10-04 07:53:17
【问题描述】:

我从 ObjC 获得了这段代码。我想将它转换为 Swift,但是,我在这样做时遇到了困难......

ObjC 代码:

navgivet.h

typedef NS_ENUM(NSInteger, BB3Photo) {
kirkenType = 10 ,
festenType = 20 ,
praestType = 30
};
@property (nonatomic, assign) BB3Photo selectedPhotoType;

navgivet.m

- (IBAction)changeImage:(id)sender {
if ([sender isKindOfClass:[UIButton class]]) {
    UIButton *button = sender;
    _selectedPhotoType = button.tag;
}
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Vælg Billed"
                                                   delegate:self
                                          cancelButtonTitle:nil
                                     destructiveButtonTitle:nil
                                          otherButtonTitles:@"Vælg fra Biblioteket", @"Vælg Kamera", nil];
sheet.actionSheetStyle = UIActionSheetStyleDefault;
[sheet showInView:[self.view window]];

}

switch (_selectedPhotoType) {
    case kirkenType: {
}break;
        case festenType: {
}break;
    case praestType: {
}break;
    default: 
       break;

这是我这次尝试的快速代码

 enum BBPhoto1: Int {
    case kommunen = 10
    case sagsbehandler = 20
    case festen = 30
}
@IBAction func changeImage(sender: AnyObject){
    if sender .isKindOfClass(UIButton){
        let button: UIButton = sender as UIButton
        selectedPhoto = BBPhoto1.fromRaw(button.tag)
    }

    let actionSheet = UIActionSheet(title: "Billeder", delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil, otherButtonTitles: "Vælg fra Biblioteket", "Vælg Kamera")
    actionSheet.showInView(self.view)

}
var selectedPhoto: BBPhoto1?

switch (selectedPhoto) {
        case kommunen {

        }

    case sagsbehandler{

        }
    }

但我收到错误:“使用未解析的标识符 kommunen”和相同的消息,但使用 Sagsbehandler。

我如何使它工作?

【问题讨论】:

  • @Pointblaster 但关键是要知道我在编程什么等。知道我想分离什么并为之制作函数。它使使用名称变得更容易,而不是发明这道菜。我也在 2014 年发布了这个 ;)
  • 抱歉,Kenny 忘记查看发布日期。你完全正确,祝你好运,希望你还在追求 swift 语言:)

标签: objective-c swift enums switch-statement ios8


【解决方案1】:

您的代码中有 3 个问题。

第一个是selectedPhoto被声明为可选,所以在switch语句中使用之前必须解包——例如使用可选绑定。

第二个问题是您使用的语法不正确。在每个case 中,您必须指定全名(包括类型),后跟冒号:

case BBPhoto1.kommunen:
    // statements

但是由于可以通过switch中使用的变量类型来推断类型,所以可以忽略枚举类型,但不能忽略点:

case .kommunen:
    // statements

最后,在 swift 中,switch 语句要求明确处理所有案例(在您的案例中为 3 个)或使用 default 案例涵盖所有未在 switch 中明确处理的案例。

您的代码的工作版本如下所示:

enum BBPhoto1: Int {
    case kommunen = 10
    case sagsbehandler = 20
    case festen = 30
}

var selectedPhoto: BBPhoto1?

if let selectedPhoto = selectedPhoto {
    switch (selectedPhoto) {
    case .kommunen:
        println(selectedPhoto.toRaw())

    case .sagsbehandler:
        println(selectedPhoto.toRaw())

    default:
        println("none")
    }
}

请注意,与其他语言不同,每种情况下的代码不会自动落入下一个情况,因此不需要break 语句 - 它的唯一用例是当一个情况没有语句时(没有语句的情况是 swift 中的错误),在这种情况下,break 只是充当占位符,其含义是“什么都不做”。

推荐阅读:Conditional Statements

【讨论】:

  • 嗯,我不明白为什么它必须在 if 语句中......但我很欣赏这个答案并会接受它
  • 调用fromRaw 会返回一个可选值,因为您传递的原始值可能不是有效值。在这种情况下,您将收到nil。这就是为什么您必须将selectedPhoto 声明为可选的原因。要使用 switch 中的值,您必须解开可选值。在这里,@Antonio 使用了可选的绑定语法if let。如果它不是nil,这会将非可选值绑定到变量。如果您向fromRaw 传递了一个错误值并且您的selectedValue 为nil,则不会输入if let 后面的块。
  • 感谢@vacawama 以如此清晰的方式解释:)
  • 我还认为在这种情况下键入if let _ = selectedPhoto { 更可取,以阐明检查可选项的含义,并在以下范围内通过selectedPhoto! 解开可选项。但这只是我个人的口味。
  • @Antonio 我们可以把它放在 switch 的条件下,这样就不用写 if 语句了吗?
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2021-09-22
  • 2017-12-09
  • 2016-12-26
相关资源
最近更新 更多