typealias
буквально просто псевдоним. Это не создает тип. Это просто упрощает ввод псевдонима.
Способ сделать то, что вы пытаетесь сделать, таков:
struct CustomerID {
let value: Int
}
struct OrderID {
let value: Int
}
Если вам нужен «голый» инициализатор (CustomerID(4)
, а не CustomerID(value: 4)
), вы можете добавить следующее:
struct CustomerID {
let value: Int
init(_ value: Int) { self.value = value }
}
Поскольку вы, вероятно, много делаете, вы можете извлечь его в протокол
protocol Identifier {
typealias IDType
init(value: IDType)
}
extension Identifier {
init(_ value: Int) { self.init(value: value) }
}
extension CustomerID: Identifier {}
ИКонечно, вы можете добавить аналогичные расширения, используя ExpressibleByIntegerLiteral
, если вам нужен такой синтаксис, как = 42
.
Конкретный синтаксис, который вы обсуждаете в F #, часто упоминается в мире Swift по имени Haskell, newtype. Swift не имеет такой простой в использовании функции, как newtype, и это обсуждалось несколько раз . В Swift есть несколько ключевых случаев, когда немного сложно решить, как вы будете автоматически соответствовать протоколам (особенно протоколам, которые требуют Self). Но это может быть реализовано когда-нибудь.
Вы можете увидеть гораздо более глубокое обсуждение этого доклада AltConf 2019 по этому вопросу .