Swift 5 调用 squareRoot()
Swift 5 calling squareRoot()
我正在阅读初学者的 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()
行生成编译器错误
Value of type 'Int' has no member 'squareRoot'
但是如果我将上面的行替换为:
test = 100.squareRoot()
那就没有编译器错误了。两个值 number
和显然 100
都是类型 Int
。那么什么是编译器不喜欢我在参数 number
上使用 squareRoot
希望这是有道理的
干杯
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
我正在阅读初学者的 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()
行生成编译器错误
Value of type 'Int' has no member 'squareRoot'
但是如果我将上面的行替换为:
test = 100.squareRoot()
那就没有编译器错误了。两个值 number
和显然 100
都是类型 Int
。那么什么是编译器不喜欢我在参数 number
squareRoot
希望这是有道理的
干杯
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