Swift Generi c Ограничение типа с оператором или - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь создать протокол, в котором общие c типы ограничены типами, которые могут быть сохранены в UserDefaults.

Возможно ли иметь ограничения типа, соответствующие определенному типу c или другому Speci c type?

Например, приведенный ниже код работает.

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 }
}

1 Ответ

1 голос
/ 21 июня 2020

Это больше похоже на XOR, поскольку переменная не может быть URL и String одновременно, но, чтобы ответить на ваш вопрос, вы не можете сделать это!

Но я думаю, вы уже это знаете, поскольку компилятор, вероятно, сказал вам:

Последовательные объявления в строке должны быть разделены ';'

Но если вы хотите, чтобы ValueToSet было URL, String или Bool. Это должно быть потому, что эти 3 типа имеют что-то общее, и это означает соответствие protocol или inheritance из базовый класс.

3 типа, которые вы указали, соответствуют

  • CKRecordValueProtocol
  • CustomReflectable
  • CustomStringConvertible
  • CVarArg
  • Decodable
  • Encodable
  • Equatable
  • Hashable
  • MLDataValueConvertible

Итак, допустим, вы хотите иметь возможность использовать их как ключи в Dictionary вы можете написать:

associatedtype ValueToSet where ValueToSet: Hashable

Это означает, что ValueToSet может быть ЛЮБОЙ тип e соответствует Hashable.

Но, поскольку вы, похоже, работаете с UserDefaults, и его методы publi c для установки значений по умолчанию: не с использованием protocols или классов.

например:

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

Этот подход не уведет вас далеко, вариант, предложенный Sweeper , вероятно, лучше всего подходит для вас.

...