无法将类型“ Int”的值转换为预期的参数类型“ Bool”

时间:2019-12-19 19:45:11

标签: swift

我是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,但是出现类似错误。

任何帮助将不胜感激!

3 个答案:

答案 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)

我有一些改进建议:

  1. 带编号的变量几乎总是一个坏主意。当您可以直接标记使用/定义时,为什么人们必须经常在使用/定义之间上下浏览,以查看哪个是哪个?在这里,当数字变量代表4400100时,这尤其可恶,这与大多数人期望的4100,{ {1}}。我建议您使用描述性名称:

    400
  2. 不要设置将被立即覆盖的临时值。而是声明值而不初始化它。 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
  3. 不要将布尔值与true进行比较。 let isLeapYear: Bool 已经在检查true。这只是产生相同的布尔值。有一些例外情况(例如检查ifBool?,而不是truefalse),但是无论如何:

    nil

  4. 请勿使用if isLeapYear { // ...。改为使用x & y == 0,它更清晰。

    x.isMultiple(of: y)
  5. 在这一点上,let remainderMod4 = year.isMultiple(of: 4) let remainderMod100 = year.isMultiple(of: 400) let remainderMod400 = year.isMultiple(of: 400) 的读取与remainderMod4几乎相同,因此只需内联它即可:

    year.isMultiple(of: 4)
  6. 您可以使用更简单的布尔表达式删除复杂的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
    }
    
  7. You年的计算应该只做一件事:确定给定年份是否为a年。将其结果也打印出给用户,这是不合适的。在单独的函数中执行此操作,或者在全局“脚本区域”中一次性执行此操作:

    let isLeapYear = (year.isMultiple(of: 4) && !year.isMultiple(of: 100))
        || year.isMultiple(of: 400)