2017-08-02 37 views
0

我试图检查字符串是否为空,如果它不是空的,我想显示在textField (outUrl.text)Swift:'!='不能应用于类型'String'和'Any'的操作数

let storage = UserDefaults.standard 
var mainsite = storage.object(forKey:"sitestring") ?? "" 

     if (mainsite != "") { 
      outUrl.text = mainsite 
     } 

但我有错误: 错误:!=不能应用于字符串类型的操作数和任何

如何检查,如果字符串是不是空的?

+0

我编辑了问题的标题和标签,因为实际上Xcode与此无关(这是Swift语言的一个特性)。 –

回答

0

由Objective-C API -[UserDefaults obejectForKey:]返回的结果是id类型的,以适应不同类型的对象(NSStringNSNumber,等,等)的。当从Swift代码访问时,这变成Any?(任何类型,或许是nil)。

如果您知道存储值确实是一个字符串,您需要在比较之前尝试进行转换:!=类型StringAny?的值之间的默认值没有定义!它会带来什么意思):

var mainsite = storage.object(forKey:"sitestring") as? String ?? "" 

这样,你要么得到一个String值(如果转换成功)或空字符串(如果失败了,因为无论有重点“sitestring”没有对象或者它不能转换为String值)。

1

推荐的解决方案是使用适当的API(string(forKey:),它返回String而不是Any和可选的绑定。

的好处是你摆脱任何类型的演员和零合并运算

if let mainsite = UserDefaults.standard.string(forKey:"sitestring"), !mainsite.isEmpty { 
    outUrl.text = mainsite 
} 
0

从UserDefaults.standard结果是类型的任何?,所以它们的值赋给变量mainsite之前,强制转换的串。这里是一个例子,

let storage = UserDefaults.standard 
    var mainsite = storage.object(forKey:"sitestring") as? String 
+0

对尼古拉斯的回答没有显着的差异。 – vadian

相关问题