的NSString?不能转换为'StringLiteralConvertible'& ?!在斯威夫特

时间:2015-06-17 04:08:15

标签: ios swift

在A组中我有这个变量:

var collectionElement  : PFObject?

然后我需要调用一个用户的方法。但在我想检查它是否为零之前。所以我做了类似的事情:

if collectionElement != nil{

  if let elementName = collectionElement["elementName"] as? NSString{
    elementTitle.text = elementName as String
  }
       ...

  query.whereKey("fileCollectionElement", equalTo:collectionElement!)
}

在B组中,我分配如下的值:

cell.collectionElement = collectionElements[indexPath.row]

其中collectionElements [indexPath.row]是PFObject。

这段代码给了我错误,并通过玩弄!和?,我可以让应用程序运行,但它崩溃了,特别是因为行coll ...!= nil

我真的很困惑?而且!的东西。什么是正确的用法和什么时候?为什么有时候我无法检查某些东西是否为零(在Objective-C中我可以一直这样做)?

1 个答案:

答案 0 :(得分:1)

?而且!对于变量: ?当变量可以是对象或可以是nil时使用。 !当变量可以是一个对象或者可以是nil时使用它但是它永远不应该是nil。这可以防止编码器每次都必须打开它。

?而且!用于铸造: " x为? ý"检查" x"可以作为" y"如果是这样的话它会被投射为" y"。 " x为! ý"迫使演员从x到y

所以在你的代码中你应该检查为?字符串,因为看起来你试图稍后将其转换为String。所以试试这个:

    if collectionElement != nil{

      if let elementName = collectionElement["elementName"] as? String{
        elementTitle.text = elementName 
      }
           ...

      query.whereKey("fileCollectionElement", equalTo:collectionElement!)
    }

至于索引countElements时的错误,这可能会返回一个nil值,因此您应确保双方就他们使用的类型达成一致。如果countElements包含一个可选的(PFObject?),那么确保cell.collection元素也是可选的(PFObject?)。

具有相同的确切类型在Swift中至关重要。