这有效:
func removeObject<T : Equatable>(object: T, array: [T]) -> Array<T>
{
return array.filter() { $0 != object }
}
let threeThings = ["one", "two", "three"]
twoThings = removeObject("three", threeThings)
但是,我想用这个!==
检查不平等。然后我得到错误“类型'T'不符合协议'AnyObject'”
如何修复此代码? (我在这里看到code,但我想学习如何正确使用过滤器。
答案 0 :(得分:3)
相同的运算符 ===
及其否定!==
仅定义为
类的实例,即AnyObject
的实例:
func removeObject<T : AnyObject>(object: T, array: [T]) -> Array<T>
{
return array.filter() { $0 !== object }
}
===
检查两个变量是否引用同一个实例。
请注意您的代码
let threeThings = ["one", "two", "three"]
twoThings = removeObject("three", threeThings)
仍然会编译并运行,但会给出(可能是意外的)结果
[one, two, three]
Swift字符串(值类型而不是类类型)是自动的
桥接到NSString
,NSString
的两个实例代表&#34;三个&#34;
不一定是一样的。
答案 1 :(得分:2)
如果您想使用!==
代替!=
,则代替类型约束<T : Equatable>
说<T : AnyObject>
。您所要做的就是聆听错误消息告诉您的内容!
请注意,这与使用过滤器功能 nothing 有关。这只是一个类型的问题。您不能将方法与未实现该方法的类型的对象一起使用。 !==
是为AnyObject实现的,因此如果要使用它,则必须向编译器保证此类型将为AnyObject。这就是类型约束的作用。
答案 2 :(得分:1)
!==
检查&#34;身份&#34;,而不是&#34;平等&#34;。 Identity是引用类型的属性,它们都支持AnyObject
协议,这意味着您要比较的两个变量指向相同的实际对象,而不仅仅是另一个对象相同的价值。
这意味着您不能将===
或!==
与普通值类型一起使用,例如字符串,整数,数组等。
尝试在游乐场中输入:
let a = "yes"
let b = a
println(a === b)
您应该收到一条消息,指出String
不符合AnyObject
协议,因为String是值类型(结构)并且不支持{{1因此,您无法使用AnyObject
。
你可以使用===
与任何类的实例,因为类是引用类型,而不是值类型。
您可以在T上设置约束,要求它符合===
。
AnyObject
然后,它应该适用于引用类型(包括所有类实例)。但是,你的函数不能用于值类型(包括所有结构)。
为什么需要检查身份(func removeObject<T : Equatable where T: AnyObject>...
)而不是相等(===
)?