2016-05-23 9 views
1

「条件付きキャストは常に成功する」という「as any AnyObject」に対して警告が表示されます。そう "?"それは必要ではない! 私が削除した場合、私は、「オプション」が必要であることに、エラーが出る「を?」:Swift:条件付きキャストは不要ですが「必須」ですか?

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'はそれが何をするのかを行います。それは_オブジェクト_です。 'Anything'にキャストする必要はありません。' Fruit'を 'Anything'にキャストするようなものです。フルーツはものなので、キャストは常に成功します。 – Arc676

答えて

1

オプションバインドはオプションをアンラップするために使用され、steeringItemsdestinationPathは非標準です。また

destinationPathが自由にNSStringsteeringItemsにブリッジすることができStringは、(SteeringItemNSObjectあるとして)NSArrayにブリッジすることができ[SteeringItem]、ですので、 - あなたは自由に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] 
} 
関連する問題