2015-10-08 3 views
1

У меня есть функция, которая возвращает мне массив AnyObject:Невозможно присвоить значение типа AnyObject к значению типа String,

public func xmppRosterDidEndPopulating(sender: XMPPRoster?) { 
    let jidList = OneChat.sharedInstance.xmppRosterStorage.jidsForXMPPStream(OneChat.sharedInstance.xmppStream) 

    contacts = jidList  
} 

и у меня есть массив: var contacts = [AnyObject]()

Позже я хочу запустить свою функцию поиска среди этих значений:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    filtered = contacts.filter({ (text) -> Bool in 
     let tmp: NSString = text as! NSString 
     let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
     return range.location != NSNotFound 
    }) 
    if(filtered.count == 0){ 
     searchActive = false; 
    } else { 
     searchActive = true; 
    } 
    self.tableView.reloadData() 
} 

но он возвращает мне ошибку:

Cannot assign a value of type AnyObject to a value of type String 

в

filtered = contacts.filter({ (text) -> Bool in 

, как я могу решить эту проблему?

+0

Какой тип 'jidList'? Постарайтесь быть как можно более конкретными, 'AnyObject' является эквивалентом' id' в Objective-C, он не указан. – vadian

+0

Это 'AnyObject' type –

+2

Да, но что это на самом деле? Кажется, это массив 'String'. Если это так, объявьте 'контакты' как' [String]() 'и down down' jidList' следующим образом: 'contacts = jidList as! [String] '. Это может решить множество проблем. – vadian

ответ

2

Метод filter возвращает массив того же типа, что и вход. В этом случае с contacts будет [AnyObject] он будет возвращать [AnyObject].

Если дело только со строками лучшим подходом здесь было бы изменить декларацию contacts представлять строки и преобразовать jidList обеспечить массив строк ...

if let jidList = OneChat.sharedInstance.xmppRosterStorage.jidsForXMPPStream(OneChat.sharedInstance.xmppStream) as? [String] { 
    contacts = jidList 
} else { 
    // handle failure to convert to string array 
} 

Код фильтрации должен затем работа как есть.

+0

Вы можете изменить его на: 'filter as String = contacts.filter ({(text) -> Bool in'? В этом случае он возвращает' Невозможно назначить неизменяемое выражение типа 'String' ' –

+0

Спасибо, это работает, НО проблема в том, что если jidList не является AnyObject, он возвращает nil. Поэтому мне нужно искать как AnyObject. Возможно ли это? –

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