Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将AnyObject类型的值分配给String类型的值_Ios_Swift_Uisearchbar_Uisearchdisplaycontroller - Fatal编程技术网

Ios 无法将AnyObject类型的值分配给String类型的值

Ios 无法将AnyObject类型的值分配给String类型的值,ios,swift,uisearchbar,uisearchdisplaycontroller,Ios,Swift,Uisearchbar,Uisearchdisplaycontroller,我有一个函数,它返回任意对象的数组: public func xmppRosterDidEndPopulating(sender: XMPPRoster?) { let jidList = OneChat.sharedInstance.xmppRosterStorage.jidsForXMPPStream(OneChat.sharedInstance.xmppStream) contacts = jidList } 我有一个数组:var contacts=[Any

我有一个函数,它返回任意对象的数组:

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


如何解决此问题?

方法返回与输入类型相同的数组。在这种情况下,由于
联系人
[AnyObject]
它将返回
[AnyObject]

如果您只处理字符串,这里最好的方法是将
联系人的声明更改为表示字符串,并将
jidList转换为提供字符串数组

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

然后,过滤代码应按原样工作。

什么类型是
jidList
?尽量具体点,
AnyObject
等同于Objective-C中的
id
,未指定。它是
AnyObject
typeYes,但实际上是什么?它似乎是一个
字符串数组
。如果是这样,则将联系人声明为
[String]()
,并按以下方式向下转换
jidList
联系人=jidList为![字符串]
。这可以解决很多问题,您可以将其改为:
filteredasstring=contacts.filter({(text)->Bool in
?在这种情况下,它返回
无法分配给'String'类型的不可变表达式。
谢谢,它可以工作,但问题是,如果jidList不是AnyObject,它返回nil。因此我需要作为AnyObject进行搜索。可能吗?
if let jidList = OneChat.sharedInstance.xmppRosterStorage.jidsForXMPPStream(OneChat.sharedInstance.xmppStream) as? [String] {
    contacts = jidList
} else {
    // handle failure to convert to string array
}