Да, вы можете определить свои собственные целочисленные типы, но это не так просто:
public struct Fatty: ExpressibleByIntegerLiteral, Hashable {
public typealias IntegerLiteralType = Int
let value: Int
public init(_ value: Int) {
self.value = value
}
public init(_ skinny: Skinny) {
self.value = skinny.value
}
public init(integerLiteral value: Int) {
self.value = value
}
}
public struct Skinny: ExpressibleByIntegerLiteral, Hashable {
public typealias IntegerLiteralType = Int
let value: Int
public init(_ value: Int) {
self.value = value
}
public init(_ fatty: Fatty) {
self.value = fatty.value
}
public init(integerLiteral value: Int) {
self.value = value
}
}
Если вы хотите, чтобы типы вели себя как реальные целые числа, вы можете заставить их соответствовать BinaryInteger
(или другим целочисленным протоколам).
Может быть как-то обобщено с использованием протокола:
public protocol CustomInt: ExpressibleByIntegerLiteral, Hashable, Comparable {
associatedtype ValueType = _ExpressibleByBuiltinIntegerLiteral
var value: ValueType { get set }
init(value: ValueType)
}
extension CustomInt {
public init(integerLiteral value: ValueType) {
self.init(value: value)
}
public init<T: CustomInt>(_ customInt: T) where Self.ValueType == T.ValueType {
self.init(value: customInt.value)
}
}
extension CustomInt where ValueType: Comparable {
public static func < (lhs: Self, rhs: Self) -> Bool {
return lhs.value < rhs.value
}
}
public struct Fatty: CustomInt {
public var value: Int
public init(value: Int) {
self.value = value
}
}
public struct Skinny: CustomInt {
public var value: Int
public init(value: Int) {
self.value = value
}
}