簡體   English   中英

如何在Swift中比較通用對象?

[英]How to compare generic objects in Swift?

考慮以下簡化代碼段:

class Foo<T: Equatable> {
    var x: T
    init(_ x: T, _ y: T) {
        self.x = x
        if (x == y) {
            // do something
        }
    }
}

我希望該課程適用於所有可以比較的T 理想情況下,它將比較T是否為對象的身份,並直接比較符合Equatable其他所有內容。
例如,上面的代碼不適用於Array 如果將Equatable更改為AnyObject並且將==更改為===則不適用於Int 我該如何解決這個問題? 我考慮過要創建自己的協議,但是后來我Equatable來如何對所有符合Equatable類型實現該Equatable

編輯:
我不知道它是否可以在Mac上運行,因為我在Linux上並且在嘗試編譯時

Foo<[Int]>([1, 2], [1, 2])

我收到以下錯誤:

error: type '[Int]' does not conform to protocol 'Equatable'
Foo<[Int]>([1, 2], [1, 2])
^

一個簡單的解決方案是簡單地為Equatable元素數組添加另一個初始化程序。

class Foo<T: Equatable> {
    init(_ x: T, _ y: T) {
        if (x == y) {
            print("Initialization by equal equatable types.")
        }
    }

    init(_ x: [T], _ y: [T]) {
        if (x == y) {
            print("Initialization by equal arrays of equatable types.")
        }
    }
}

let a = Foo<Int>(1, 1)
    /* Initialization by equal equatable types. */
let b = Foo<Int>([1, 2, 3], [1, 2, 3])
    /* Initialization by equal arrays of equatable types. */

根據您打算對Foo進行的操作,可能不必使它成為泛型類,而只需要泛型初始化器即可:

class Foo 
{
    init<T:Equatable>(_ x: T, _ y: T) 
    {
        if (x == y) 
        {
            // do something
        }
    }

    init<T:AnyObject>(_ x: T, _ y: T) 
    {
        if (x === y) 
        {
            // do something
        }
    }
}

// in Playground ...

class Bar { }

let C = Foo(3,4)  // no error

let O1 = Bar()
let O2 = Bar()

let D = Foo(O1,O2)  // no error

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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