Swift 5 вызывает squareRoot () - PullRequest
1 голос
/ 15 мая 2019

Я читаю Swift 4 для начинающих.Я делаю проверку простых чисел и хочу использовать функцию squareRoot(), чтобы получить квадратный корень перед делением, чтобы проверить на простое число.

Вот мой код:

 func isPrime(_ number: Int) -> Bool {
    switch number {
    case _ where number < 1 :
        return false
    case 1:
        return true
    default:
        break
    }
    let test = number.squareRoot()
    for i in 2..<number {
        if isDivisable(number, by: i) {
            return false
        }
    }
    return true
 }

Строка let test = number.squareRoot() генерирует ошибку компилятора

Значение типа 'Int' не имеет члена 'squareRoot'

Но если я заменю вышеуказанную строку на:

test = 100.squareRoot()

Тогда нет ошибки компилятора.Оба значения number и, очевидно, 100 имеют тип Int.Так что компилятору не нравится, когда я использую squareRoot для параметра number

Надеюсь, это имеет смысл

Cheers

1 Ответ

4 голосов
/ 15 мая 2019

squareRoot() - это метод, определенный в протоколе FloatingPoint , которому соответствуют Double и Float, но не целочисленные типы, такие как Int.

.для преобразования Int в Double (и результат обратно в Int):

let upperBound = Int(Double(number).squareRoot())
for i in 2..<upperBound {

Другой пример

let test = 100.squareRoot()

компилируется, потому что и Int, и Double соответствует протоколу ExpressibleByIntegerLiteral, т.е. может быть инициализирован из целочисленного литерала.Здесь компилятор автоматически определяет 100 как значение с плавающей запятой, потому что это единственный способ заставить код компилироваться.Здесь становится очевидным:

let test = 123.squareRoot()
print(test) // 11.090536506409418
...