Ios 我应该在Swift 4中使用可选字符串吗

Ios 我应该在Swift 4中使用可选字符串吗,ios,mobile,swift4,Ios,Mobile,Swift4,当我更新到Xcode 9.3时,我正在制作一个应用程序,它附带了一个变化,即如果let语句不能强制展开变量位于顶层 这迫使我做了很多更改,因为在我对服务器的所有HTTP请求(不知道是否有帮助,但我使用Alamofire)中,我收到了字符串变量,所以我通常会强制展开它们,比如在这里,我得到了一个对象的价格 if let result = response.result.value! as? Dictionary<String, AnyObject>{

当我更新到Xcode 9.3时,我正在制作一个应用程序,它附带了一个变化,即如果let语句不能强制展开变量
位于顶层

这迫使我做了很多更改,因为在我对服务器的所有HTTP请求(不知道是否有帮助,但我使用Alamofire)中,我收到了字符串变量,所以我通常会强制展开它们,比如在这里,我得到了一个对象的价格

if let result = response.result.value! as? Dictionary<String, AnyObject>{

                if let Price = result["Price"] as? String!{
                    if(Price != nil){
                        self.Error = ""
                        self.price = Int(Price)!
                        completed()
                    }
                }
}
或者这样:

            if let Price = result["Price"] as? String{
                if(Price != nil){
                    self.Error = ""
                    self.price = Int(Price)!
                    completed()
                }
            }

我想你误解了
意味着。即使
是隐式展开的
是同一件事-它们都表示一个
可选对象。这意味着您仍然可以这样做:

let string: String! = nil
if string == nil { return }

您的
结果[“价格”]的原因是什么?绳子
被弃用是因为它毫无意义。您将获得一个常规的可选(
String?
),将其强制转换为“闭嘴编译器,这是存在的”可选(
String!
),但使用
if let
确保代码仅在值实际存在时才继续。因此,您告诉编译器闭嘴,但在代码继续之前,仍然要确保该值存在。。。没有道理,对吧?这就是它被弃用的原因<代码>在此处不起任何作用,可以安全删除

您的代码可以如下所示并实现相同的结果:

        if let Price = result["Price"] as? String {
            self.Error = ""
            self.price = Int(Price)!
            completed()
        }

对于第一行,第二行是正确的,
if-let
向您保证,如果程序进入if语句,则属性不会为零。您可以省略对
价格的检查!=nil
它的变量应该是
price
-小p-我强烈建议你去掉Int的强制展开;如果无法解析数据,则应在错误中返回某种运行时错误,例如
throw
。请尽量避免展开。有时它会添加更多的代码,但这是完全值得的。第二种方式是“as”?字符串{``对我来说很好。
        if let Price = result["Price"] as? String {
            self.Error = ""
            self.price = Int(Price)!
            completed()
        }