如何使用可选的“?”和“!”在快速?

时间:2016-07-04 05:53:18

标签: ios swift optional

我在学习XCode7.3。 “?”和“!”总是让我感到困惑。

我的代码如下。

name : nametype : typeimage : image显示错误消息:

  

可选类型'String?'的值没打开,你的意思是用'!'还是'?'?

@IBAction func unwindToHomeScreen( segue : UIStoryboardSegue ) {
    if let addRestaurantController = segue.sourceViewController as? AddRestaurantController {
        let name = addRestaurantController.name
        let location = addRestaurantController.location
        let type = addRestaurantController.type
        let isVisited = addRestaurantController.isVisited
        let image = addRestaurantController.imageView

        restaurants.append( Restaurant(
            name : name,
            type : type,
            location : location,
            phoneNumber : "UNKNOW",
            image : image,
            isVisited : isVisited? ?? false
        ) )

        print( addRestaurantController.imageView )
    }
}

我将代码修改为name : name!name : name?,但仍无效。我该如何解决?

2 个答案:

答案 0 :(得分:0)

我认为这可以解决您的问题。

如果addRestaurantController.locationaddRestaurantController.nameaddRestaurantController.type是可选的。

@IBAction func unwindToHomeScreen( segue : UIStoryboardSegue ) {

    if let addRestaurantController = segue.sourceViewController as? AddRestaurantController , name = addRestaurantController.name, location = addRestaurantController.location, type = addRestaurantController.type, isVisited = addRestaurantController.isVisited, image = addRestaurantController.imageView
    {
        restaurants.append( Restaurant(
            name : name,
            type : type,
            location : location,
            phoneNumber : "UNKNOW",
            image : image,
            isVisited : isVisited? ?? false
            ) )
    }
}

您尚未指定addRestaurantController.locationaddRestaurantController.nameaddRestaurantController.type是否可选。并且您在没有正确分析的情况下随机提交了您的问题。

请为其他人的时间赋予更多价值。并提出有意义的问题。详细了解Stackoverflow问题的指南。

答案 1 :(得分:0)

可能没有什么理由,但首先我建议您阅读选项(?)并明确解开选项(!)此处https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

就问题而言,name中变量Restaurant的可选性很可能与本地定义的定义不同。虽然局部变量名称被定义为可选的,例如, let name: String?Restaurant期望它不是可选的(可能定义为let name: String(最后请注意没有?))。这意味着您需要解包可选值以将其传递给Restaurant(请参阅上面的链接以了解解包的方法,根据您的使用情况,很少有)

如果要切换到Swift 3,请记住显式解包的选项的行为已更改。有关动机和深度描述,请阅读此提案https://github.com/apple/swift-evolution/blob/master/proposals/0054-abolish-iuo.md

但是有人指出,Swift 3无法在Xcode 7中编译,你需要下载Xcode 8的beta版