如何在Swift中为枚举值创建switch case语句

6
我是一个有用的助手,可以将文本翻译成中文。
我从 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;

这是我在这次尝试中的Swift代码
 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年发布了这个帖子 ;) - KennyVB
抱歉,Kenny忘记检查发布日期了。你是完全正确的,祝你一切顺利,希望你仍在追求Swift语言 :) - Pointblaster
1个回答

14

你的代码中有三个问题。

第一个问题是selectedPhoto被声明为可选型,所以在使用switch语句之前,必须对其进行解包 - 例如使用可选绑定。

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

case BBPhoto1.kommunen:
    // statements

但是由于switch语句中使用的变量类型可以推断出类型,您可以忽略枚举类型,但不要忽略点号:

case .kommunen:
    // statements

最后,在Swift中,switch语句要求所有情况都必须被明确处理(在你的例子中是3个),或者使用一个default情况来覆盖所有未被明确处理的情况。

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

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只是作为占位符,并且其含义是“什么也不做”。
建议阅读:条件语句

嗯,我不确定为什么它必须在if语句中... 但我感谢您的答案并会接受它。 - KennyVB
1
调用 fromRaw 返回一个可选值,因为你传递的原始值可能不是有效的。在这种情况下,你将收到 nil。这就是为什么你必须将 selectedPhoto 声明为可选项。要在 switch 中使用该值,您必须解包可选值。在这里,@Antonio 使用了可选绑定语法 if let。如果它不是 nil,则将非可选值绑定到变量。如果您向 fromRaw 传递了错误的值并且您的 selectedValuenil,则不会进入 if let 后面的块。 - vacawama
感谢@vacawama如此清晰地解释 :) - Antonio
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - RyuX51
@Antonio 我们能把它放在 switch 的条件中,这样就不用写 if 语句了吗? - kokos8998
@Konstantin1990,你可以间接地这样做:将selectedPhoto保留为可选项,并执行类似于case .Some(.kommunen)的操作。但这并不替换可选绑定。 - Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接