2016-08-18 8 views
1

私はObj-C-Swiftアプリケーションが混在しています。
マイカスタムオブジェクト - C MapViewControllerItemがスイフトで書かれたカスタムクラスで次のヘッダーファイルを持っています。Swift: "タイプ 'Item!'の値を割り当てることができません。 「Item!」と入力します。

@class Item; 
@interface MapViewController : UIViewController 
@property (nonatomic, strong) Item *item; 
@end 

MapViewControllerにセグエが

self.performSegueWithIdentifier(kMapSegueId, sender: item) 
を用い Itemオブジェクト itemで開始されます

itemsenderとして送信されます。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == kMapSegueId { 
     let mapViewController = segue.destinationViewController as! MapViewController 
     mapViewController.item = sender as! Item! // This gives the error 
    } 
} 

しかし、MapViewControllerの財産itemへの代入は、コンパイラエラー

は、型の値に割り当てることができません提供します「アイテムを!」 「Item!」と入力します。

どうすればこの奇妙なエラーを回避できますか?

+1

'as!'は既に 'Item'の後のオプションの感嘆符をアンラップしますが、意味がありません。 – vadian

+0

@vadian:私は以前これを試しましたが、Itemの後ろに感嘆符が付きませんでした。 "タイプ 'Item'の値を代入できません" –

+0

'Item'は' @objc'属性を持っていますか? –

答えて

1


ただし、削除すると別のコンパイラエラーが発生しました。理由は以下の通りです:

私が既存のObj-CプロジェクトをSwiftに翻訳し始めたとき、すべてのクラスがObj-Cで書かれていたので、私はBridgingヘッダーを設定し、すべてのhファイルをインポートしました。私はクラスごとにスウィフトに翻訳を始めました。
私が忘れたのは、既にSwiftに翻訳されていたファイルの#importステートメントを削除することでした。したがって、クラスItemViewControllerのインポートステートメントはまだありました。

これらのインポートステートメントをブリッジヘッダーから削除すると、コンパイラエラーは消えました。

4

!を削除します。 に変換する必要があります(Item!ではなく)。

mapViewController.item = sender as! Item 

コンパイラは暗黙のブリッジをあまりにも多く作成しようとしています。それは遠すぎる一つの橋です。 .itemのタイプがItem!であることを私が賭けているにもかかわらず、あなたはそれを無視して、常にそれをItemとすべきです。 Swift 2.2の!タイプは、多くの複雑さを抱えています(可能な限り避けてください)、多くの魔法のObjCブリッジングに結びついています。これがスイフト3で再設計された理由です。


上記は該当しますが、おそらくあなたの問題ではありません。問題は、sender自体がオプションであることです。したがって、AnyObject?からItemにキャストしようとしています。最初にsenderif letまたは!のいずれかでラップ解除する必要があります。

mapViewController.item = sender! as! Item 

私はおそらくこれを書き換えます:ヴァディアンロブ・ネーピアは私のコードが原因項目の背後にある感嘆符に間違っていた、示唆したように

if let item = sender as? Item, 
    mapViewController = segue.destinationViewController as? MapViewController 
    where segue.identifier == kMapSegueId { 
    mapViewController.item = item 
} 
+0

私はこれを前に試しましたが、Itemの後ろに感嘆符がなくても、 "'Item!'という型の値を代入できません。 –

+0

あなたの提案したコードをありがとう。私はそれをテストしましたが、割り当てはまだ "タイプ 'Item'のタイプ 'Item'の値を割り当てることができませんエラーを与える –

+0

あなたの答えは正しいですが(+1)、それはもう1つあったので、私の問題を解決しませんでした私のプロジェクトの問題。私は1分で私の答えを掲示します。 –

関連する問題