2015-01-14 4 views
1

У меня возникли проблемы с прохождением массива строк между содержащим приложением и приложением часов, и я разместил вопросом ранее о получении ошибки String is not identical to AnyObject - 'String' is not identical to 'AnyObject' errorПроблем с отображением массива строк в таблице Watch App

Когда я отвечал на этот вопрос, я объявляющий массивы Сторожевой приложение как так:

var tempNames = [""] 
var tempAmounts = [""] 
var tempDates = [""] 

Теперь я объявляя их так:

var tempNames = [] 
var tempAmounts = [] 
var tempDates = [] 

Это устраняет другую ошибку, однако теперь я получаю сообщение об ошибке в другой строке. Теперь, когда я пытаюсь отобразить строки в TableView, я получаю ошибку 'AnyObject' is not convertible to 'String'. Вот мой код:

for (index, tempName) in enumerate(tempNames) { 
     let rowNames = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 

     rowNames.nameLabel.setText(tempName) 
    } 

    for (index, tempAmount) in enumerate(tempAmounts) { 
     let rowAmounts = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 

     rowAmounts.amountLabel.setText(tempAmount) 
    } 

    for (index, tempDate) in enumerate(tempDates) { 
     let rowDates = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 

     rowDates.dateLabel.setText(tempDate) 
    } 

Я получаю ошибку на rowNames.nameLabel.setText(tempName) линии.

Куда я иду не так?

ответ

0

В Swift массивы всегда содержат объекты явного типа ... в отличие от Objective-C массив не может содержать произвольные объекты. Поэтому вам нужно объявить, что ваши массивы будут содержать строки.

var tempNames = [String]() 
var tempAmounts = [String]() 
var tempDates = [String]() 

Это не всегда очевидно, потому что в некотором рабочем коде вы не увидите этого. Это связано с тем, что если компилятор может вывести из контекста, в котором хранятся строки в массиве, вы можете опустить явное определение типа. Например:

var tempNames = ["Sarah", "Seraj", "Luther", "Aroha"] 

Что касается приведенного выше кода, вам нужно бросить as? String:

for (index, tempName) in enumerate(tempNames) { 
    let rowNames = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 
    rowNames.nameLabel.setText(tempName) as? String 
} 

for (index, tempAmount) in enumerate(tempAmounts) { 
    let rowAmounts = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 
    rowAmounts.amountLabel.setText(tempAmount) as? String 
} 

for (index, tempDate) in enumerate(tempDates) { 
    let rowDates = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController 
    rowDates.dateLabel.setText(tempDate) as? String 
} 
+0

Спасибо за ответ. Когда я это пробую, я получаю предложение изменить его на '[String]()', но когда я делаю эту коррекцию, ошибка '' String 'не идентична «AnyObject», происходит снова в той же строке, что и раньше. – user3746428

+0

Обновлен до текущего синтаксиса. Посмотрел книгу Apple Swift, чтобы подтвердить, что я писал, был прав до исходного сообщения, но 'String []()' был изменен на '[String]()' во время их изменений API для Swift. –

+0

Итак, используя код, который вы предложили, я теперь получаю ошибку '' String 'не идентичен «AnyObject» на «tempNames = defaults? .objectForKey (« namesWatch ») как строки NSArray', а ошибка '' String 'не является подтипом' Void'' в 'rowNames.nameLabel.setText (tempName) как? Строковые строки. Есть идеи? – user3746428

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