簡體   English   中英

無法讓Swift使用我的通用==運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM