我正在为初学者阅读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
希望这很有意义
欢呼
答案 0 :(得分:4)
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