2016-05-23 29 views
1

我得到了“有条件的转换总是成功”的“as?AnyObject”的警告。那么“?”这是不需要的!? 如果我删除,我得到一个错误,我必须有“可选”,“?”:斯威夫特:有条件的演员不需要,但“必须”?

func toDictionary() -> [String: AnyObject] { 
    var retval = [String: AnyObject]() 
    if let 
     steeringItems = self.steeringItems as? AnyObject, 
     destinationPath = self.destinationPath as? AnyObject 
    { 
     retval["steeringItems"] = steeringItems 
     retval["gDstPath"] = destinationPath 
    } 
    return retval 
} 

什么是正确的方法是什么?

+0

什么'steeringItems'和'destinationPath'的类型?听起来就像你只是想将它们直接分配给字典而没有任何可选的绑定 - 因为它们不是可选项,并且可以自由地上传到AnyObject。 – Hamish

+0

我认为问题在于你投射到AnyObject,它已经知道,但你应该投射到预期类型的​​属性,如String/Int – Scriptable

+0

“AnyObject”完成它所说的事情。这是_任何对象。在不需要的时候投射到'AnyObject'就像将'Fruit'投射到'Anything'一样。水果是一件东西,所以演员们一定会成功。 – Arc676

回答

1

可选绑定用于解开可选项,而您的steeringItemsdestinationPath是非可选项。

而且,因为destinationPathString,可自由桥接到NSStringsteeringItems[SteeringItem],其可桥接至NSArray(如SteeringItemNSObject) - 你可以自由地起来,转换为AnyObject。因此你不需要做任何有条件的转换(因为它永远不会失败)。

所以只是不要使用可选的绑定!只需直接分配的属性:

func toDictionary() -> [String:AnyObject] { 

    var retval = [String: AnyObject]() 

    retval["steeringItems"] = steeringItems 
    retval["gDstPath"] = destinationPath 

    return retval 
} 

或者更简洁:

func toDictionary() -> [String:AnyObject] { 
    return ["steeringItems":steeringItems, "gDstPath":destinationPath] 
}