2016-08-18 105 views
1

我有一個混合的Obj-C - Swift應用程序。
我的定製的OBJ-C MapViewController具有下面的頭文件中,其中Item是寫在夫特自定義類:Swift:「無法賦值類型'Item!'的值鍵入'Item!'

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

的SEGUE到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'的值來鍵入'Item!'」 –

+0

Item'是否有'@ objc'屬性? –

回答

1

由於vadian羅布納皮爾建議,我的代碼是錯誤的,由於項目背後的感嘆號。
但是,刪除它確實給出了另一個編譯器錯誤。原因如下:

當我開始將我現有的Obj-C項目翻譯成Swift時,我設置了Bridging標頭,並在那裏導入了我所有的h文件,因爲我所有的類都是用Obj-C編寫的。然後我開始按班上課進行Swift翻譯。
我忘記了刪除了已經轉換爲Swift的文件的#import語句。因此,仍有類別ItemViewController的進口報表。

一旦我從橋接頭中刪除了這些導入語句,編譯器錯誤就消失了。

4

刪除額外的!。您應該轉換爲Item,而不是Item!

mapViewController.item = sender as! Item 

編譯器試圖在這裏製造太多的隱式橋;這是一座橋樑太遠了。儘管我打賭.item的類型是Item!,但您應該忽略它,並始終將它作爲Item。 Swift 2.2中的類型有很多複雜性(應儘可能避免),這些類型綁定了很多魔術ObjC橋接。這就是爲什麼他們在斯威夫特3.


以上是真進行了重新設計,但可能不是你的問題。問題是sender本身是可選的。所以你試圖從AnyObject?投到Item。您需要先用if let!解開sender

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),但它沒有解決我的問題,因爲還有一個我的項目中存在問題。我會在一分鐘後發佈我的答案。 –

相關問題