Generics 在Swift语言中具有自定义对象的泛型类型
我想知道有没有办法在下面的泛型函数中用Generics 在Swift语言中具有自定义对象的泛型类型,generics,swift,Generics,Swift,我想知道有没有办法在下面的泛型函数中用=运算符比较两个泛型类型实例: func compare<T>(T a, T b) -> Bool { if a == b{ // do something return true; }else{ // do another thing return false; } } 您可以创建自己的等价运算符==和!=,像这样: @infix func ==
=
运算符比较两个泛型类型实例:
func compare<T>(T a, T b) -> Bool {
if a == b{
// do something
return true;
}else{
// do another thing
return false;
}
}
您可以创建自己的等价运算符==和!=,像这样:
@infix func == (left: MyObj, right: MyObj) -> Bool {
return (left.id == right.id) && (left.name == right.name)
}
@infix func != (left: MyObj, right: MyObj) -> Bool {
return !(left == right)
}
var obj1 = MyObj()
var obj2 = MyObj()
obj1.id = 5
obj1 == obj2 // false
obj2.id = 5
obj1 == obj2 // true
obj1.name = "John"
obj1 == obj2 // false
来自苹果开发者资源部 并非Swift中的每种类型都可以与等于运算符(=)进行比较。例如,如果您创建自己的类或结构来表示一个复杂的数据模型,那么Swift无法猜测该类或结构的“等于”含义。因此,无法保证此代码适用于所有可能的类型T,并且在尝试编译代码时会报告相应的错误 然而,一切都没有失去。Swift标准库定义了一个名为
Equalable,它需要任何符合条件的类型来实现等于运算符(=) 和不等于运算符(!=)来比较该类型的任意两个值。全部 Swift的标准类型自动支持Equalable协议 任何可等于的类型都可以安全地与findIndex函数一起使用,因为它保证支持等于运算符。为了表达这一事实,在定义函数时,将Equatable类型约束作为类型参数定义的一部分:
func compare<T>(T a, T b) -> Bool {
if a == b{
// do something
return true;
}else{
// do another thing
return false;
}
}
在你的情况下,你会这样做
class MyObj{
var id = 3
var name: String?
}
func == (lhs: MyObj, rhs: MyObj) -> Bool {
return lhs.id == rhs.id
}
为了使用泛型的
compare()
方法,您需要使类符合,然后可以使用=
操作符(但是您也可以轻松地直接调用=
操作符):
导入可可粉
类MyObj:可均衡{
变量id:Int=0
变量名称:字符串?
}
func==(左:MyObj,右:MyObj)->Bool{
返回lhs.id==rhs.id&&lhs.name?==rhs.name?
}
函数比较(a:T,b:T)->Bool{
返回a==b
}
var obj1=MyObj()
obj1.id=12;
obj1.name=“安迪”
var obj2=MyObj()
obj2.id=12;
obj2.name=“安迪”
如果比较(obj1、obj2){
println(“相等”)
}否则{
println(“不相等”)
}
所以我必须为我自己的对象实现均衡
协议以使其具有可比性?为什么使用比较方法?你就不能用==
操作符进行比较吗?@GokhanArik是的,我在回答中提到了这一点。但是,看看OP的问题,他想在compare()
本身内做一些事情。很抱歉,我没有注意到这一点。为什么==覆盖函数在类之外?如果我有多个Equalable类,它还会工作吗?
struct MyStruct: Equatable {
var name = "Untitled"
}
func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name == rhs.name
}
let value1 = MyStruct()
var value2 = MyStruct()
let firstCheck = value1 == value2
// firstCheck is true
value2.name = "A New Name"
let secondCheck = value1 == value2
// secondCheck is false
class MyObj{
var id = 3
var name: String?
}
func == (lhs: MyObj, rhs: MyObj) -> Bool {
return lhs.id == rhs.id
}
import Cocoa
class MyObj : Equatable {
var id: Int = 0
var name: String?
}
func == (lhs: MyObj, rhs: MyObj) -> Bool {
return lhs.id == rhs.id && lhs.name? == rhs.name?
}
func compare<T: Equatable>(a: T, b: T) -> Bool {
return a == b
}
var obj1 = MyObj()
obj1.id = 12;
obj1.name = "Andy"
var obj2 = MyObj()
obj2.id = 12;
obj2.name = "Andy"
if compare(obj1, obj2) {
println("equal")
} else {
println("not equal")
}