我想引入一個協議,它將強制我的列舉有變數next回傳相同型別的列舉。然后我希望能夠呼叫方法來比較兩個列舉。
protocol MySequenceProtocol {
associatedtype T
var next: T { get }
}
func compareNext<T: MySequenceProtocol>(input: T, target: T) {
if input.next == target {
print("match"/span>)
}
}
compareNext(input: Weekdays.monday.next, target: Weekdays.tuesday)
compareNext(input: Months.Jan.next, target: Months.feb)
但是,我有一個錯誤 二進制運算子'=='不能應用于'T.T'和'T'型別的運算元
我的完整代碼和一些列舉的例子:
protocol MySequenceProtocol {
associatedtype T
var next: T { get }
}
enum Weekdays: MySequenceProtocol {
case 周一, 周二, 周三, 周四, 周五, 周六, 周日
var next: Weekdays {
switch self {
case .monday:
return .tuesday
default:
return .monday
}
}
}
enum Months。MySequenceProtocol {
case jan, feb, march
var next: Months {
switch self {
case .jan:
return .feb
case .feb:
return .march
default:
return .jan
}
}
}
func compareNext<T。MySequenceProtocol>(input: T, target: T) {
if input.next == target { 錯誤在此。
print("match"/span>)
}
}
我覺得問題在于限制協議回傳相同的T,但是我不確定如何用Swift來表達。
uj5u.com熱心網友回復:
你的協議宣告實際上并沒有正確地表達你的需求。對next使用關聯型別的要求使得與next屬于不同型別的型別相符合成為可能。
你實際上需要的是Self,它指的是符合的型別。
protocol MySequenceProtocol{
var next: Self { get }
然后你還需要指定你的通用型別約束T符合Equatable,并使你的列舉實際符合Equatable。
func compareNext<T: MySequenceProtocol>(input: T, target: T) where T: Equatable {
if input.next == target {
print("match"/span>)
}
}
enum Weekdays: MySequenceProtocol, Equatable {
...。
}
enum Months: MySequenceProtocol, Equatable {
...。
}
你還錯誤地呼叫了你的compareNext函式。你應該簡單地將列舉的情況傳遞給它,你不應該呼叫next,因為這個函式本身已經呼叫了next。
compareNext(input: Weekdays.monday, target: Weekdays.tuesday)
compareNext(input: Months.Jan, target: Months.feb)
uj5u.com熱心網友回復:
你可以通過使用除T以外的名稱來使錯誤資訊更有用:
protocol MySequenceProtocol{
associatedtype Next
var next: Next { get }
}
func compareNext<MSP: MySequenceProtocol>(input: MSP, target: MSP) {
if input.next == target { 錯誤在此。
print("match"/span>)
}
}
然后會得到:
錯誤:二進制運算子
==不能應用于MSP.Next和MSP型別的運算元。
這就明確了:沒有人保證MSP和它的Next關聯型別是同一型別,因此,它們不能與==進行比較。
最突出的修正是只要求Next與Self相同:
protocol MySequenceProtocol{
associatedtype Next where Next = Self
var next: Next { get }
}
當然,這就是一個普通的老的Self要求的作用!
現在這給了你一個新的錯誤:
錯誤:二進制運算子'=='不能應用于兩個'MSP'運算元
。這是有道理的,因為你從來沒有表達過MSP(或它所約束的MySequenceProtocol型別)是可等價的要求。解決這個問題:
func compareNext<MSP: MySequenceProtocol& Equatable>(input: MSP, target: MSP) {
if input.next == target { 錯誤在此。
print("match"/span>)
}
}
compareNext(input: Weekdays.monday.next, target: Weekdays.tuesday)
compareNext(input: Months.Jan.next, target: Months.feb)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/318633.html
標籤:
