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")
}