[英]Can't make Swift use my Generic == Operator
我的應用程序包含許多Core Data NSManagedObject子類,所有這些子類都有一個NSDate,我稱之為它們的recordID。 比較兩個對象時,我想使用此數據來確定它們是否相同。 現在,由於有許多子類,因此我創建了一個協議以表明它們都實現了recordID:
protocol HasID
{
var recordID: NSDate {get}
}
簡單吧? 現在,我實現了==運算符,如下所示:
func == <T: HasID>(left: T, right: T) -> Bool
{
return left.recordID == right.recordID ? true : false
}
問題-Swift不使用我漂亮的==運算符,而是與一些通用廢話進行比較,如下所示
func ==(lhs: NSObject, rhs: NSObject) -> Bool
現在,如果我為每個子類實現==,如下所示
func == (left: Pilot, right: Pilot) -> Bool
{
return left.recordID == right.recordID ? true : false
}
然后,它使用我的運算符進行工作。 (我還為NSDate實現了==運算符,這就是上面的代碼很好的原因。)
有什么想法可以讓我的通用==運算符而不是NSObject使用嗎?
您可以聲明一個中綴運算符:
// I've modified your protocol just for my example
protocol HasID
{
var recordID: Int {get}
}
infix operator <*> {
associativity right
}
func <*> (left: HasID, right: HasID) -> Bool
{
return left.recordID == right.recordID ? true : false
}
// example:
class Fake: HasID {
var recordID = 1
}
class Bull: HasID {
var recordID = 1
}
let fake = Fake()
let bull = Bull()
if fake <*> bull {
println("is equal")
}
綜合先前的意見和建議,似乎是由於NSManagedObject
所致。
將以下代碼放在操場上:
import UIKit
import CoreData
protocol HasID
{
var recordID: NSDate {get}
}
func == <T: HasID>(left: T, right: T) -> Bool
{
println("==")
return left.recordID.isEqualToDate(right.recordID)
}
func ~= <T: NSManagedObject where T: HasID>(left: T, right: T) -> Bool
{
println("~=")
return left.recordID.isEqualToDate(right.recordID)
}
class Managed: NSManagedObject, HasID {
let recordID: NSDate = {
let components = NSDateComponents()
components.day = 31
components.month = 3
components.year = 2015
let gregorian = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
return gregorian.dateFromComponents(components)!
}()
}
let foo = Managed()
let bar = Managed()
foo == bar
foo ~= bar
switch foo {
case bar:
println("Equal")
default:
println("Not Equal")
}
如您所見, 重載的 ==
不會被調用,但是~=
被調用。 因此,我建議不要強迫NSManagedObject
使用重載的==
並改用~=
。 如您所見,您還將使它也可以在switch
語句中使用(實際上,它是模式匹配運算符)。
如果您從示例中刪除NSManagedObject
,則將看到對於普通類,您的解決方案將起作用。
我的觀點是, NSManagedObject
==
運算符用於比較托管對象ID,而不是內存中的指針。 當同一托管對象存在於不同托管對象上下文中時,其內存中的指針可能會不同。 這就是為什么我不會超載的原因。 它有助於在不同上下文中跟蹤同一受管對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.