Arrays 函数的过滤数组
当我过滤函数数组以从数组中排除特定函数时,过滤后的数组不包含任何元素。你知道为什么会这样吗Arrays 函数的过滤数组,arrays,swift,Arrays,Swift,当我过滤函数数组以从数组中排除特定函数时,过滤后的数组不包含任何元素。你知道为什么会这样吗 var array: [()->()] = [] array.append(function1) array.append(function2) let function: () function = function1() var filteredArray: [()->()] = [] filteredArray = array.filter { $0() != function }
var array: [()->()] = []
array.append(function1)
array.append(function2)
let function: ()
function = function1()
var filteredArray: [()->()] = []
filteredArray = array.filter { $0() != function }
print(filteredArray.count) // 0
无法筛选非标称类型。这是因为它们不相等: 即以下是一些非标称类型
Any
-元组
Void aka()aka空元组
函数aka()->()
struct方法:可哈希、可等式{
变量名称:String
var方法:()->()//或任何您想要的类型
init(n:String,m:@escaping()->()){
name=n
方法=m
}
//相等的
静态函数==(lhs:Method,rhs:Method)->Bool{
返回lhs.name==rhs.name
}
//散列
func散列(放入散列程序:inout散列程序){
hasher.combine(名称)
}
}
因此,名称
检查方法是否相等。但是structs
就到此为止了
如果需要,可以创建类似的类
,以跟踪引用
示例代码:
func function1(){print(“foo”)}
func function2(){print(“bar”)}
变量数组:[方法]=[]
append(方法(“一”,函数1))
append(方法(“两个”,函数2))
let函数:方法
函数=方法(“一”,函数1)
var filteredArray:[方法]=[]
filteredArray=array.filter{$0!=function}
打印(filteredArray.count)//1
filteredArray.first?.method()//打印“条”
Void(空元组)它不是一个函数。顺便说一句,()->()
它不是可均衡的这不是如何创建一个包含函数的数组吗?是一个不返回任何值的函数的结果。空元组也称为Void。数组声明是正确的。function=function1()将function1的结果分配给空函数。数组中的所有函数都返回Void(不会返回与空元组相同的任何内容)$0()
将执行函数code并返回Void
,因此所有元素都等于function
,即Void
,这就是它返回空数组的原因。如果方法
结构是可等式的{$0.name!=function.name}
是冗余的{$0!=function}
当我尝试将该方法附加到数组时,我得到一个错误“调用中的额外参数”,并警告“初始化'method'(又名'OpaquePointer')会导致指针悬空”@stepjesse我刚刚修复了代码中的一个bug,因此应该可以解决这个问题。请回应,如果它仍然不工作。我花了一些时间来实现它到我的游戏正确,但它的工作非常完美谢谢!