Сопоставимый протокол - PullRequest
       23

Сопоставимый протокол

0 голосов
/ 20 сентября 2019

Я изучаю документацию Apple «Разработка приложений со Swift» и пробую примеры в разделе «Протоколы».В части Comparable Protocol я попробовал следующий код, не добавляя Comparable к структурным ссылкам, и не столкнулся с какими-либо проблемами, он работает:

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

Но когда я попытался отсортировать с оператором «больше чем» (<): </p>

print("Decending")

let employeesSorted2 = employees.sorted(by: >)

for employee in employeesSorted2 {
    print(employee)
}

Произошло сообщение об ошибке:

ошибка: ссылка на функцию оператора '>' в 'Comparable' требует, чтобы 'Employee' соответствовал 'Comparable', пусть employeeSorted2= employee.sorted (by:>)

У вас есть веское объяснение этому несоответствию?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Comparable требует, чтобы вы реализовали оператор <, затем он использует эту функцию вместе с реализацией ==, чтобы выяснить реализацию >, <= и >=.

Это произойдет, только если вы объявите, что ваша структура Comparable, если вы этого не сделаете, компилятор не знает, какую функцию использовать.

Просто объявите вашу структуру как сопоставимую: struct Employee: Equatable, Comparable

0 голосов
/ 20 сентября 2019

Для протокола Comparable требуется оператор <.Вы не можете соответствовать Comparable без оператора <.Colllection.sorted() требует Comparable соответствия.

Соответствие Comparable автоматически дает определения операторов >, >= и <= (используя предоставленную вами <).Если вы соответствуете Comparable, вы можете использовать оператор >, предоставленный соответствием Comparable, в качестве функции сравнения.

Оператор < не требует протокола Comparable.Вы можете реализовать (и явно использовать) оператор < без соответствия Comparable.Collection.sorted(by:) не требует соответствия Comparable, и вы можете рассматривать оператор < как функцию сравнения.

...