Ios 使用映射进行迭代时排除数组中的元素
我有如下代码Ios 使用映射进行迭代时排除数组中的元素,ios,arrays,swift,array-map,Ios,Arrays,Swift,Array Map,我有如下代码 let myNums = getXYZ(nums: [1,2,3,4,5]) func getXYZ(nums: [Int]) -> [Int] { let newNum = nums.map { (num) -> Int in if num == 2 { //do something and continue execution with next element in list like break/fallthrough ret
let myNums = getXYZ(nums: [1,2,3,4,5])
func getXYZ(nums: [Int]) -> [Int] {
let newNum = nums.map { (num) -> Int in
if num == 2 {
//do something and continue execution with next element in list like break/fallthrough
return 0
}
return num
}
return newNum
}
print(myNums)`
这将打印[1,0,3,4,5]
但我希望输出是[1,3,4,5]。如何排除2?我想修改使用的if语句,以便在看到数字2时不包含在数组中
我必须在这里使用.map,但要排除2.有没有可能
请让我知道我只需做一个
过滤器
,正如您的问题所述,您想通过删除另一个数字来过滤这些数字
var myNums = [1, 2, 3, 4, 5]
let excludeNums = [2]
let newNum = myNums.filter({ !excludeNums.contains($0) })
print(newNum) //1, 3, 4, 5
如果需要进行映射,可以先进行映射
,然后进行过滤
let newNum = myNums.map({ $0*2 }).filter({ !excludeNums.contains($0) })
print(newNum) //4, 6, 8, 10
这映射到将两者相乘2
,然后通过从列表中删除新的2
进行过滤。如果要删除初始的2
,必须先过滤,然后映射。由于两者都返回一个[Int]
,您可以根据需要按任何顺序调用操作。我只需按照您的问题所述进行筛选,您需要通过删除另一个号码来筛选这些号码
var myNums = [1, 2, 3, 4, 5]
let excludeNums = [2]
let newNum = myNums.filter({ !excludeNums.contains($0) })
print(newNum) //1, 3, 4, 5
如果需要进行映射,可以先进行映射
,然后进行过滤
let newNum = myNums.map({ $0*2 }).filter({ !excludeNums.contains($0) })
print(newNum) //4, 6, 8, 10
这映射到将两者相乘2
,然后通过从列表中删除新的2
进行过滤。如果要删除初始的2
,必须先过滤,然后映射。由于两者都返回一个[Int]
,您可以根据需要按任何顺序调用操作。正如@koropok所建议的,我必须做以下更改
nums.compactMap{(num)->Int?in
....
如果num==2{
归零
}根据@koropok的建议,我必须做以下更改
nums.compactMap{(num)->Int?in
....
如果num==2{
归零
}我建议您使用过滤器而不是地图:
let myNums = [1,2,3,4,5]
let result1 = myNums.filter{ return $0 != 2 }
print(result1) // This will print [1,3,4,5]
如果一定要使用map,请使用compactMap:
let result2 = myNums.compactMap { return $0 == 2 ? nil : $0 }
print(result2) // This will print [1,3,4,5]
希望这有帮助我建议您使用过滤器而不是地图:
let myNums = [1,2,3,4,5]
let result1 = myNums.filter{ return $0 != 2 }
print(result1) // This will print [1,3,4,5]
如果一定要使用map,请使用compactMap:
let result2 = myNums.compactMap { return $0 == 2 ? nil : $0 }
print(result2) // This will print [1,3,4,5]
希望这对您的用例有所帮助过滤器
比映射更合适
如果只想排除1个数字:
func getXYZ(nums: [Int]) -> [Int] {
return nums.filter { $0 != 2 }
}
如果要排除数字列表,请将这些排除项存储在集中,因为Set.contains
在O(1)
时间中运行,而Array.contains
在O(n)
时间中运行
func getXYZ(nums: [Int]) -> [Int] {
let excluded: Set<Int> = [2,4]
return nums.filter { !excluded.contains($0) }
}
func getXYZ(nums:[Int])->[Int]{
let excluded:Set=[2,4]
返回nums.filter{!excluded.contains($0)}
}
过滤器
比映射更适合您的用例
如果只想排除1个数字:
func getXYZ(nums: [Int]) -> [Int] {
return nums.filter { $0 != 2 }
}
如果要排除数字列表,请将这些排除项存储在集中,因为Set.contains
在O(1)
时间中运行,而Array.contains
在O(n)
时间中运行
func getXYZ(nums: [Int]) -> [Int] {
let excluded: Set<Int> = [2,4]
return nums.filter { !excluded.contains($0) }
}
func getXYZ(nums:[Int])->[Int]{
let excluded:Set=[2,4]
返回nums.filter{!excluded.contains($0)}
}
使用compactMap并在num==2时返回nil,它表示“nil与返回类型'Int'不兼容”。请尝试koropok对flatMap的建议flatMap被取消,它也会返回相同的错误,即使使用flatMap“nil与返回类型'Int'不兼容”。我尝试了num==2{return nil}正如koropok所说,使用compactMap
并在闭包中使返回类型可以为null,例如(num)->Int?
使用compactMap并在num==2时返回nil,它表示“nil与返回类型'Int'不兼容”。尝试koropok对flatMap的建议flatMap会被删除,即使使用flatMap也会返回相同的错误“nil与返回类型'Int'”不兼容。我尝试过如果num==2{return nil}像koropok所说的那样使用compactMap
,在闭包内部使返回类型可以为null,就像这样(num)->Int?
你可以对内联闭包使用速记参数名
。remove(num)->int?并将num==2替换为$0==2。只需对内联闭包使用速记参数名即可。删除(num)->int?并将num==2替换为$0==2。