在这种情况下,为什么我必须显式解包我的字符串?

Nic*_*ico 3 swift

我有一个字符串var oneString: String!,后来在一个方法中,当我想连接一个字符串,oneString我必须这样做:

oneString! += anyString
Run Code Online (Sandbox Code Playgroud)

如果我不添加,!我会收到错误'String!' is not identical to 'CGFloat'

如果我初始化我的字符串var oneString = ""我没有这个问题.为什么?为什么我需要打开,oneString而我明确表示在我宣布它时它不会是零?

Air*_*ity 6

为什么我需要打开,oneString而我明确表示在我宣布它时它不会是零?

你误解了什么var oneString: String!意思.这并不意味着oneString不会是零.如果将类型声明为var oneString: String,则表示不能为nil的类型.

该类型String!是"隐式解包的可选".也就是说,它是一个可选的,很像String?,但有时候假装是非可选的.主要是为了阅读它 - 你不必明确地解开它来获得价值.缺点是,如果它永远是零(并且它完全可以),您的代码将陷阱并中止.

但这种假装不可选只是到目前为止.您不能将该参数传递String!给函数,inout因为该参数不是可选的.因此你的问题.

Anton的答案是完全正确的,为什么它不起作用,他建议的运算符重载将使你的代码编译.但它不是正确的解决方案 - 您应该避免使用隐式解包的选项,因为它们是弹簧加载的死亡陷阱,并且仅在特定情况下使用(最常见的是使用Cocoa UI控件).1000个中的999次,使用常规可选或非选购会更好