Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 如何按NSDictionary中的Key:value筛选NSArray_Ios_Swift - Fatal编程技术网

Ios 如何按NSDictionary中的Key:value筛选NSArray

Ios 如何按NSDictionary中的Key:value筛选NSArray,ios,swift,Ios,Swift,我想知道如何通过“name”值过滤掉NSArray字典 获取: let string = "https://api/connect/" let url = NSURL(string: string) let request = NSMutableURLRequest(url: url! as URL) request.httpMethod = "GET" let session = URLSession.shared let tache = ses

我想知道如何通过“name”值过滤掉NSArray字典

获取:

    let string = "https://api/connect/"
    let url = NSURL(string: string)
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "GET"
    let session = URLSession.shared
    let tache = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSArray {
            print(jsonObj)
            teamList = jsonObj as! [[String : Any]]

            DispatchQueue.main.async {
                self.teamCollectionView.reloadData()
            }
        }
    }
    tache.resume()
此代码是结果并被放入团队列表中

JSON:

({
    id = 1;
    logo = "testLogo";
    name = "testTeam1";
    "url" = "https://example.com";
},
    {
    id = 2;
    logo = "testLogo";
    name = "testTeam2";
    "url" = "https://example.com";
},
    {
    id = 3;
    logo = "testLogo";
    name = "testTeam3";
    "url" = "https://example.com";
})
放入团队列表后的外观示例:

let example = [[id: "1", logo: "image", name: "testTeam1", url: "https"], [id: "2", logo: "image", name: "testTeam2", url: "https"]] 
尝试筛选的代码:

 let array2Name = teamFilteredList.flatMap { $0["name"] }
    teamFilteredList = teamList.reduce(teamFilteredList, { result, value in
        !array2Name.contains(where: { $0 as! _OptionalNilComparisonType == value["testTeam3"] }) ? result + [value]: result
    })
到目前为止,这段代码非常可怕。但是在网上没有别的东西能告诉我怎么做。所以我被卡住了

导致崩溃:


无法强制转换类型为“\uu NSCFString”的值

更新:

我有一个集合视图,它是由NSURL从获取中填充的,NSURL为我提供了一个填充了NSArrays的字典,我想通过一个已经在NSArray索引中的值筛选出该字典中的所有NSArray索引,该值的键为:“name”

这回答了这个链接最终答案中的问题,但它不是最新的,并且会产生错误。
尝试使用此谓词

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { $0 == fromDict["name"] as? String ?? ""})})
诀窍在于斯威夫特的错误没有表现力。它说,
不使用where
,为什么?因为编译器确实需要一个字符串,因为您的闭包不正确

如果
array2Name
也是字典。尝试将
where
子句更改为:

where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") }
其中:{($0[“name”]as?String??)==(fromDict[“name”]as?String??)}
因此,整个功能将是:

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") })})
teamFilteredList.filter({fromDict in return!array2Name.contains(其中:{($0[“name”]as?String??)===(fromDict[“name”]as?String??)})
如果您想学习更有效的函数式编程,并且不介意使用JavaScript,请尝试以下方法


尝试使用此谓词

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { $0 == fromDict["name"] as? String ?? ""})})
诀窍在于斯威夫特的错误没有表现力。它说,
不使用where
,为什么?因为编译器确实需要一个字符串,因为您的闭包不正确

如果
array2Name
也是字典。尝试将
where
子句更改为:

where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") }
其中:{($0[“name”]as?String??)==(fromDict[“name”]as?String??)}
因此,整个功能将是:

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") })})
teamFilteredList.filter({fromDict in return!array2Name.contains(其中:{($0[“name”]as?String??)===(fromDict[“name”]as?String??)})
如果您想学习更有效的函数式编程,并且不介意使用JavaScript,请尝试以下方法


使用自定义结构和
JSONDecoder

创建一个结构

struct Team : Decodable {
    let id : Int
    let logo : String
    let name : String
    let url : URL
}
创建数组

var teamList = [Team]()
var teamFilteredList = [Team]()
解码JSON

let string = "https://api/connect/"
let url = URL(string: string)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error { print(error); return }
    do {
        self.teamList = try JSONDecoder().decode([Team].self, from: data!)
        DispatchQueue.main.async {
            self.teamCollectionView.reloadData()
        }
    } catch {
        print(error)
    }
}
task.resume()
并对数组进行过滤

teamFilteredList = teamList.filter{ $0.name == "testTeam3" }

使用自定义结构和
JSONDecoder

创建一个结构

struct Team : Decodable {
    let id : Int
    let logo : String
    let name : String
    let url : URL
}
创建数组

var teamList = [Team]()
var teamFilteredList = [Team]()
解码JSON

let string = "https://api/connect/"
let url = URL(string: string)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error { print(error); return }
    do {
        self.teamList = try JSONDecoder().decode([Team].self, from: data!)
        DispatchQueue.main.async {
            self.teamCollectionView.reloadData()
        }
    } catch {
        print(error)
    }
}
task.resume()
并对数组进行过滤

teamFilteredList = teamList.filter{ $0.name == "testTeam3" }

无法强制转换类型为“\uu NSCFString”的值。您正在尝试将字符串存储到其他数据类型。所以它越来越糟了,谢谢,必须有一个更简单的方法来做到这一点@McDonal_11你想做什么?我把它放在了更新中@McDonal_11。我们鼓励你使用自定义类或结构,而不是字典。它使事情变得简单。无法强制转换类型为“\uu NSCFString”的值。您正在尝试将字符串存储到其他数据类型。所以它越来越糟了,谢谢,必须有一个更简单的方法来做到这一点@McDonal_11你想做什么?我把它放在了更新中@McDonal_11。我们鼓励你使用自定义类或结构,而不是字典。这使事情变得简单。比我以前得到的更接近,lol,尽管我得到了一个错误“二进制运算符”==“不能应用于”[String:Any]”类型的操作数和“String”array2Name,我用已经填充的变量teamList替换了它们。我得到的错误是,
array2Name
似乎不是字符串数组。这段代码是关于ArrayName的,它是一个字符串数组。因此,请尝试以下
where:{($0[“name”]as?String???”==fromDict[“name”as?String???”)}
这样做,并且,为了使条件失败,当两者都不是stringscloser时,我从未遇到过这样的情况,lol尽管我得到了一个错误“Binary operator”==“无法应用于”[String:Any]类型的操作数'和'String'array2Name,我已替换为已填充的变量teamList。我得到的错误是,
array2Name
似乎不是字符串数组。这段代码是关于ArrayName的,它是一个字符串数组。因此,请尝试以下
where:{($0[“name”]as?String???”==fromDict[“name”as?String???)}
执行此操作,并在两个都不是字符串时使条件失败