过滤函数语法?

时间:2015-01-12 20:13:33

标签: swift

这有效:

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,但我想学习如何正确使用过滤器。

3 个答案:

答案 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字符串(值类型而不是类类型)是自动的 桥接到NSStringNSString的两个实例代表&#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>... )而不是相等(===)?