2016-08-18 4 views
1

У меня смешанное приложение Obj-C - Swift.
Мой заказ Obj-C MapViewController имеет следующий заголовок файла, в котором Item является пользовательский класс написанный в Swift:Swift: «Невозможно присвоить значение типа« Item! » набрать «Item!»

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

переход к MapViewController начинается с Item объекта item использованием

self.performSegueWithIdentifier(kMapSegueId, sender: item) 

Это вызывает, когда item отправляется как sender:

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 
    } 
} 

Однако присвоение свойству item в MapViewController дает ошибку компилятора

Невозможно присвоить значение типа "Пункт! для ввода «Item!»

Как я могу избежать этой странной ошибки?

+1

'как!' Уже разворачивает необязательный восклицательный знак после 'Item', не имеет смысла и, скорее всего, проблема. – vadian

+0

@vadian: Я пробовал это раньше, но без восклицательного знака позади Item я получаю сообщение об ошибке «Не могу присвоить значение типа« Item »для ввода« Item! »« –

+0

Имеет ли 'Item' атрибут' @ objc'? –

ответ

1

Как vadian и предложил Rob Napier, мой код был неправ в связи с восклицательным знаком позади Пункт.
Однако удаление этого файла дало еще одну ошибку компилятора. Причина в том, что:

Когда я начал переводить мой существующий проект Obj-C в Swift, я настроил заголовок Bridging и импортировал туда все мои h-файлы, так как все мои классы были написаны в Obj-C , Затем я начал переводить класс за классом в Swift.
Что я забыл, так это удалить инструкцию #import для файлов, которые уже были переведены в Swift. Итак, все еще были заявления по импорту для классов Item и ViewController.

Как только я удалил эти операторы импорта из заголовка моста, ошибка компилятора исчезла.

4

Удалить дополнительные !. Вы должны преобразовать в Item, а не Item!.

mapViewController.item = sender as! Item 

Компилятор пытается создать слишком много неявных мостов здесь; это один мост слишком далеко. Несмотря на то, что я делаю ставку, тип .item равен Item!, вы должны игнорировать это и всегда это как Item. ! типов в Swift 2.2 имеют много сложностей вокруг них (и их следует избегать, когда это возможно), привязанных к большому количеству магии моста ObjC. Вот почему они были переработаны в Swift 3.


Вышеупомянутое верно, но, вероятно, не ваша проблема. Проблема в том, что sender сам по себе необязателен. Итак, вы пытаетесь отличить от AnyObject? до Item. Вам необходимо сначала развернуть sender либо с if 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 », чтобы набрать« Item! »« –

+0

Спасибо за ваш предложенный код. Я тестировал его, но задание все еще дает ошибку «Невозможно присвоить значение типа« Item », чтобы ввести« Item! ». –

+0

Ваш ответ правильный (+1), но это не решило мою проблему, так как был еще один проблема в моем проекте. Я отправлю свой ответ через минуту. –

Смежные вопросы