2016-05-23 30 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] 
}