2014-10-04 114 views
3

我从ObjC得到了这段代码。我想将其转换为斯威夫特,但是,我有这样的困难......如何使枚举开关case(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{ 

     } 
    } 

,但我得到的错误:与同messege但Sagsbehandler‘未解决的标识符kommunen的使用’。

如何让它工作?

回答

9

您的代码有3个问题。

第一个是selectedPhoto被声明为可选的,因此在使用switch语句之前必须打开它 - 例如使用可选绑定。

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

case BBPhoto1.kommunen: 
    // statements 

但由于类型可以通过在开关中使用的变量类型来推断,则可以忽略该枚举类型,但不点:

case .kommunen: 
    // statements 

最后,在一个迅速陈述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

+0

嗯,不知道我理解为什么富人是在一个if语句... ,但我很欣赏的答案,并会接受它 – KennyVB 2014-10-04 08:14:49

+1

调用'fromRaw'返回一个可选的值,因为你传递的原始价值可能不是一个有效的价值。那样的话,你会收到'nil'。这就是为什么你必须声明'selectedPhoto'是可选的。要使用'switch'中的值,你必须打开可选值。在这里,@Antonio使用了可选的绑定语法'if let'。如果它不是'nil',则将非可选值绑定到变量。如果你向'fromRaw'传递了一个错误的值,并且你的'selectedValue'为零,那么'if let'后面的块将不会被输入。 – vacawama 2014-10-04 08:58:18

+0

谢谢@vacawama以这样一种清晰的方式解释:) – Antonio 2014-10-04 10:09:27