Сделайте типизы Int, которые не совместимы с назначением - PullRequest
0 голосов
/ 18 апреля 2019

Я хотел бы сделать некоторые типы Integer, которые не совместимы с присваиванием, как показано ниже.

    typealias Fatty = Int
    typealias Skinny = Int

    var a : Fatty = 6
    var b: Skinny = 4

    a = b // This should throw a compile time error saying the types are incompatible

    a = Fatty(b) // this should work

Есть ли способ сделать это быстро (без создания класса / структуры)?Раньше можно было делать это на паскале.

1 Ответ

5 голосов
/ 18 апреля 2019

Да, вы можете определить свои собственные целочисленные типы, но это не так просто:

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...