Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 可比协议_Swift_Comparable_Swift Protocols - Fatal编程技术网

Swift 可比协议

Swift 可比协议,swift,comparable,swift-protocols,Swift,Comparable,Swift Protocols,我正在浏览苹果公司的“应用程序开发与Swift”文档,并尝试协议部分的示例。在可比协议部分,我尝试了以下代码,但没有向结构引用中添加可比,并且没有遇到任何问题,它正在工作: struct Employee: Equatable { var firstName : String var lastName : String var jobTitle : String var phoneNumber : String static func ==(lhs: E

我正在浏览苹果公司的“应用程序开发与Swift”文档,并尝试协议部分的示例。在可比协议部分,我尝试了以下代码,但没有向结构引用中添加
可比
,并且没有遇到任何问题,它正在工作:

struct Employee: Equatable {
    var firstName : String
    var lastName : String
    var jobTitle : String
    var phoneNumber : String

    static func ==(lhs: Employee, rhs : Employee) -> Bool {
        return lhs.firstName == rhs.firstName && lhs
        .lastName == rhs.lastName
    }
    static func <(lhs: Employee, rhs : Employee) -> Bool {
        return lhs.lastName < rhs.lastName
    }

}

let employee1 = Employee(firstName: "Ben", lastName: "Atkins", jobTitle: "Front Desk", phoneNumber: "415-555-7767")
let employee2 = Employee(firstName: "Vera", lastName: "Carr", jobTitle: "CEO", phoneNumber: "415-555-7768")
let employee3 = Employee(firstName: "Grant", lastName: "Phelps", jobTitle: "Senior Manager", phoneNumber: "415-555-7770")
let employee4 = Employee(firstName: "Sang", lastName: "Han", jobTitle: "Accountant", phoneNumber: "415-555-7771")
let employee5 = Employee(firstName: "Daren", lastName: "Estrada", jobTitle: "Sales Lead", phoneNumber: "415-555-7772")

let employees = [employee1, employee2, employee3, employee4, employee5]
let employeesSorted = employees.sorted(by: <)

for employee in employeesSorted {
    print(employee)
}
出现错误消息:

错误:引用“Compariable”上的运算符函数“>”要求“Employee”符合“Compariable” 让employeesSorted2=employees.sorted(按:>)


对于这种不一致性,您有有效的解释吗?

Comparable
要求您实现
=
的实现

只有在声明结构是可比较的时才会发生这种情况,否则编译器不知道使用什么函数

只需将结构声明为可比较:
struct Employee:equalable,Comparable
Comparable
要求您实现
=/code>的实现

只有在声明结构是可比较的时才会发生这种情况,否则编译器不知道使用什么函数

只需将结构声明为可比较:
struct Employee:equalable,compariable

compariable
协议需要
pConforming to codecompable/code自动为您提供代码/代码、代码>=
的定义
可比较的
协议需要
pConforming to codecompable/code自动为您提供代码/代码的定义,代码>=
,以及它需要可比的粗糙度的
,我不怀疑这一点。第一个代码堆栈不添加Comparable,它的排序部分小于“,”(@YahyaOz这是因为您自己实现了
,降序排序也会起作用。
Comparable
则使用
@LinusGeffarth自动实现
,因为
不是
is code>=/code>,它不是
@L因为
a
并不意味着
!(a>b)而使用inusgefarth
,因为可能是
a==b
,其中一个既不大于也不小于other@YahyaOz
=
是可均衡的
的要求
可比较的
类型(植入为
(a
)(一个粗略的代码需要可比较,我不怀疑这一点。第一个代码堆栈不添加可比较的,排序部分小于“,”。排序(@YahyaOz这是因为您自己实现了
,降序排序也会起作用。
Comparable
则使用
@LinusGeffarth自动实现
,因为
不是
is code>=/code>,它不是
@L因为
a
并不意味着
!(a>b)而使用inusgefarth
,因为可能是
a==b
,其中一个既不大于也不小于other@YahyaOz
=
是可均衡的
的要求
可比
类型的默认代码实现=/code,code/code,code>=
(植入为
(a
)(谢谢你,罗布,现在更清楚了。斯威夫特怎么知道我正在实现“==”或“
=
谢谢你,罗布,现在更清楚了。斯威夫特怎么知道我正在实现“==”或
=
只是说它“不工作”太模糊了。
结构员工{让名字、姓氏、职务、电话号码:字符串}”
实现您的equalable操作符
扩展雇员:equalable{static func==(lhs:Employee,rhs:Employee)->Bool{return(lhs.firstName,lhs.lastName)==(rhs.firstName,rhs.lastName)}
和比较操作符
扩展雇员:compariable{static func<(lhs:Employee,rhs:Employee)->Bool{return(lhs.firstName,lhs.lastName)<(rhs.firstName,rhs.lastName)}
谢谢你,利奥,我在下面得到了一些答案。现在更清楚了。斯威夫特怎么知道我正在实现“==”或“只是说它“不工作”太模糊了。
struct Employee{让firstName,lastName,jobTitle,phoneNumber:String}
实现您的equalable操作符
扩展雇员:equalable{static func==(lhs:Employee,rhs:Employee)->Bool{return(lhs.firstName,lhs.lastName)==(rhs.firstName,rhs.lastName)}
和比较运算符
扩展Employee:Comparable{static func<(lhs:Employee,rhs:Employee)->Bool{return(lhs.firstName,lhs.lastName)<(rhs.firstName,rhs.lastName)}
谢谢你,利奥,我在下面得到了一些答案。现在更清楚了。斯威夫特怎么知道
print("Decending")

let employeesSorted2 = employees.sorted(by: >)

for employee in employeesSorted2 {
    print(employee)
}