我是Swift的新手,无法弄清为什么出现以下错误:
exit status 1
main.swift:17:13: error: cannot convert value of type 'Int' to expected argument type 'Bool'
else if remainder2 && remainder == 0{
^~~~~~~~~~
main.swift:21:12: error: cannot convert value of type 'Int' to expected argument type 'Bool'
else if remainder && remainder3 == 0 {
^~~~~~~~~
对于以下代码:
var aYear = Int(readLine()!)!
func isLeap(year: Int) {
let remainder = year % 4
let remainder2 = year % 400
let remainder3 = year % 100
var whatLeap = false
if remainder == 0 {
whatLeap = true
} else if remainder2 && remainder == 0 {
whatLeap = true
} else if remainder && remainder3 == 0 {
whatLeap = false
} else {
whatLeap = false
}
if whatLeap == true {
print("YES")
} else {
print("NO")
}
}
isLeap(year: aYear)
我尝试将变量“ whatLeap”更改为String,但是出现类似错误。
任何帮助将不胜感激!
答案 0 :(得分:2)
您需要完整说明以下两个语句:
remainder2 == 0 && remainder == 0
如果您将语句原样保留为remainder2 == true && remainder == 0
,这是在说什么,这将解释您为什么将错误消息Int发送给Bool。
再举一个例子:
var tOrF = false
if tOrF == true {}
和if tOrF {}
是相同的语句。
答案 1 :(得分:1)
您需要将两个变量都比较为0,否则您是在说是否剩余2存在且剩余== 0。
if remainder == 0 {
whatLeap = true
} else if remainder2 == 0 && remainder == 0 {
whatLeap = true
} else if remainder == 0 && remainder3 == 0 {
whatLeap = false
}
答案 2 :(得分:0)
我有一些改进建议:
带编号的变量几乎总是一个坏主意。当您可以直接标记使用/定义时,为什么人们必须经常在使用/定义之间上下浏览,以查看哪个是哪个?在这里,当数字变量代表4
,400
,100
时,这尤其可恶,这与大多数人期望的4
,100
,{ {1}}。我建议您使用描述性名称:
400
不要设置将被立即覆盖的临时值。而是声明值而不初始化它。 Swift编译器的一项巧妙功能称为“确定初始化”,该功能可确保所有变量在使用前至少设置一次。早于此时间使用它会导致错误,提醒您该错误。因为您永远都不会更改值,所以可以将func isLeap(year: Int) {
let remainderMod4 = year % 4
let remainderMod100 = year % 100
let remainderMod400 = year % 400
var isLeapYear = false
if remainderMod4 == 0 {
isLeapYear = true
} else if remainderMod400 == 0 && remainderMod4 == 0 {
isLeapYear = true
} else if remainderMod400 == 0 && remainderMod100 == 0 {
isLeapYear = false
} else {
isLeapYear = false
}
if isLeapYear == true {
print("YES")
} else {
print("NO")
}
}
提升为isLeapYear
常量。
let
不要将布尔值与true进行比较。 let isLeapYear: Bool
已经在检查true
。这只是产生相同的布尔值。有一些例外情况(例如检查if
是Bool?
,而不是true
或false
),但是无论如何:
nil
请勿使用if isLeapYear { // ...
。改为使用x & y == 0
,它更清晰。
x.isMultiple(of: y)
在这一点上,let remainderMod4 = year.isMultiple(of: 4)
let remainderMod100 = year.isMultiple(of: 400)
let remainderMod400 = year.isMultiple(of: 400)
的读取与remainderMod4
几乎相同,因此只需内联它即可:
year.isMultiple(of: 4)
您可以使用更简单的布尔表达式删除复杂的if / else分支:
if year.isMultiple(of: 4) == 0 {
isLeapYear = true
} else if year.isMultiple(of: 400) == 0 && year.isMultiple(of: 4) == 0 {
isLeapYear = true
} else if year.isMultiple(of: 400) == 0 && year.isMultiple(of: 100) == 0 {
isLeapYear = false
} else {
isLeapYear = false
}
You年的计算应该只做一件事:确定给定年份是否为a年。将其结果也打印出给用户,这是不合适的。在单独的函数中执行此操作,或者在全局“脚本区域”中一次性执行此操作:
let isLeapYear = (year.isMultiple(of: 4) && !year.isMultiple(of: 100))
|| year.isMultiple(of: 400)