簡體   English   中英

Swift 帶有或運算符的通用類型約束

[英]Swift Generic Type Constraint with or operator

我正在嘗試將泛型類型僅限於類型的協議保存到 UserDefaults。

是否可以具有符合特定類型或其他特定類型的類型約束?

例如下面的代碼有效。

public protocol UserDefaultsRequestType {

    associatedtype ValueToSet where ValueToSet == URL

    var valueToSet: ValueToSet { get }
}

我想要實現的東西就像打擊

public protocol UserDefaultsRequestType {

    // Value should either be a type URL, String or Bool
    associatedtype ValueToSet where ValueToSet == URL || ValueToSet == String || ValueToSet == Bool

    var valueToSet: ValueToSet { get }
}

這看起來更像 XOR,因為變量不能同時是URLString ,但要回答您的問題,您不能這樣做!

但我想你已經知道了,因為編譯器可能告訴你:

一行中的連續聲明必須用';'分隔

但是,如果您希望ValueToSetURLStringBool ,這應該是因為這 3 種類型具有您需要的共同點,這意味着符合protocol或來自基礎inheritance的 ZA2F2ED4F8EBC1CBB1DZC2。

您提供的 3 種類型符合

  • CKRecordValue協議
  • 自定義反射
  • CustomStringConvertible
  • CVarArg
  • 可解碼
  • 可編碼
  • 平等的
  • 可散列
  • MLDataValueConvertible

因此,假設您希望能夠將它們用作Dictionary中的鍵,您可以編寫:

associatedtype ValueToSet where ValueToSet: Hashable

這意味着ValueToSet可以是符合Hashable任何類型。

但是由於您似乎正在使用UserDefaults並且設置默認值的公共方法使用protocols或類。

例如:

func set(_ url: URL?, forKey defaultName: String)

這種方法不會讓您走得太遠, Sweeper提出的方法可能最適合您。

暫無
暫無

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

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