Случайные нельзя использовать в экземпляре Int, поведение в Linux - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь выяснить, как сделать приведенный ниже код для компиляции в Linux.Решение для Дарвина self.init(arc4random_uniform(UInt32(upperLimit))) работает хорошо, но self.init(random() % upperLimit) генерирует ошибку ниже.

extension Int {
    /// Initializes a new `Int ` instance with a random value below a given `Int`.
    ///
    /// - Parameters:
    ///   - randomBelow: The upper bound value to create a random value with.
    public init?(randomBelow upperLimit: Int) {
        guard upperLimit > 0 else { return nil }
        #if os(Linux)
            self.init(random() % upperLimit)
        #else
            self.init(arc4random_uniform(UInt32(upperLimit)))
        #endif
    }
}

Ошибка:

error: repl.swift:11:27: error: static member 'random' cannot be used on instance of type 'Int'
                self.init(random() % upperLimit)
                          ^~~~~~
                          Self.
  • У меня есть догадка, это можно исправитьс добытчиками, но я не смог найти решение.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 19 сентября 2018

Если вы получаете эту ошибку, то, вероятно, вы используете Swift 4.2, который поставляется с новым случайным API .Ошибка возникает из-за того, что компилятор считает, что вы пытаетесь обратиться к новому статическому random(in:) методу FixedWidthInteger, которому соответствует Int (тот факт, что он игнорирует глобальную функцию это известная ошибка ).

Чтобы сгенерировать случайное значение Int от 0 до (но не включая) заданной верхней границы n, теперь вы можете просто сказать:

let i = Int.random(in: 0 ..< n)

См. вышеупомянутое связанное предложение для получения дополнительной информации о новом случайном API.

Учитывая, насколько простым является новый API, я бы сказал, что нет необходимости реализовыватьобычай
init?(randomBelow:).Однако, если вы все еще хотите, вы можете реализовать его следующим образом:

extension Int {
  /// Initializes a new `Int ` instance with a random value below a given `Int`.
  ///
  /// - Parameters:
  ///   - randomBelow: The upper bound value to create a random value with.
  public init?(randomBelow upperLimit: Int) {
    guard upperLimit > 0 else { return nil }
    self = .random(in: 0 ..< upperLimit)
  }
}

Новый случайный API является кроссплатформенным, поэтому теперь нет необходимости выполнять какую-либо условную компиляцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...