Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 2:x27型表达模式;布尔';无法匹配类型为';Int';_Swift_Switch Statement_Fizzbuzz - Fatal编程技术网

Swift 2:x27型表达模式;布尔';无法匹配类型为';Int';

Swift 2:x27型表达模式;布尔';无法匹配类型为';Int';,swift,switch-statement,fizzbuzz,Swift,Switch Statement,Fizzbuzz,我正在做这个题集“FizzBuzz”,我的switch语句给了我一些问题,下面是我的代码: func fizzBuzz(n: Int) -> String { switch n { case n % 3 == 0: print("Fizz") case n % 5 == 0: print("Buzz") case n % 15 == 0:print("FizzBuzz") } return "\(n)" } 如果你能给我提供指针/提示

我正在做这个题集“FizzBuzz”,我的switch语句给了我一些问题,下面是我的代码:

func fizzBuzz(n: Int) -> String {   
    switch n {
    case n % 3 == 0: print("Fizz")
    case n % 5 == 0: print("Buzz")
    case n % 15 == 0:print("FizzBuzz")
    }
    return "\(n)"
}
如果你能给我提供指针/提示,而不是给我正确的代码,那就太棒了:D
我更愿意自己解决这个问题,但一些提示可以帮我走出这个困境。

您可以使用
case let where
并在分别检查它们之前检查两者是否匹配:

func fizzBuzz(n: Int) -> String {
    let result: String
    switch n {
    case let n where n.isMultiple(of: 3) && n.isMultiple(of: 5):
        result = "FizzBuzz"
    case let n where n.isMultiple(of: 3):
        result = "Fizz"
            case let n where n.isMultiple(of: 5):
        result = "Buzz"
    default:
        result = "none"
    }
    print("n:", n, "result:", result)
    return result
}
有两件事不对:

(1) 您的案例是布尔表达式,因此您希望将它们与
true
,而不是
n

(2) 您需要一个默认案例。因此:

func fizzBuzz(n: Int) -> String {
    switch true {
    case n % 3 == 0: print("Fizz")
    case n % 5 == 0: print("Buzz")
    case n % 15 == 0: print("FizzBuzz")
    default: print("Shoot")
    }
    return "\(n)"
}

我知道现在回答这个问题有点晚了。我正在用另一种方法更新@Leo Dabus的答案,这种方法是在Xcode 7.3.1和Swift 2.2上编写和测试的

func fizzBuzz(n: Int) -> String {
 switch n {
  case _ where n % 3 == 0:
    print("Fizz")
  case _ where n % 5 == 0:
    print("Buzz")
  case _ where n % 15 == 0:
    print("FizzBuzz")
  default:
    print("none")
 }
 return "\(n)"
}

谢谢,希望这有帮助。

有点晚了,但只是为了补充各种答案。我认为现在使用的优雅解决方案是:

func fizzBuzz(n: Int) {
    switch (n%3==0, n%5==0) {
    case (true, false):
        print("Fizz")
    case (false, true):
        print("Buzz")
    case (true, true):
        print("FizzBuzz")
    default:
        print(n)
    }
}
Swift可以切换元组(sorta结构,但在代码的其他地方没有定义的情况下动态构造)。然后,在案例标签中,您可以一次检查多个值,这是FizzBuzz的理想选择

把它分解一下,这部分

(n%3==0, n%5==0)
生成具有两个布尔值的元组。然后是这样的箱子标签

case (true, true)
    print("FizzBuzz")
检查这两个值(基本上是
n%3==0
n%5==0
)是否为真,并打印“嘶嘶嘶嘶”

这样做使它很容易扩展。您可以在switch参数中添加第三个定义,在案例中添加第三个true/false,您的FizzBuzz就可以成为FizzBuzzJazz。如果需要,还可以通过简单地添加标签来命名元组中的值,如

switch (fizz: n%3==0, buzz: n%5==0, jazz: n%7==0) {
case (fizz: true, buzz: false, jazz: true)
    print("FizzJazz")
}

使代码在某些情况下更具可读性。

第一个提示:
where
clauseOther提示:可能您希望您的方法
返回每种情况下的字符串,而不是仅打印它们并返回n。。。用这个做实验。然后您可以使用该方法的结果来打印,而不是在该方法中打印。相关:(但不幸的是,它包含完整的解决方案:)另一个提示:案例是按照从上到下的顺序进行评估的,因此请考虑您想要“嘶嘶嘶嘶”的位置我有一个类似的情况,我想根据数组的(通用)元素类型做一些不同的事情,这是唯一对我有效的事情。非常感谢。这很有趣,
switch-true
而不是
switch-n
来绕开丑陋/无用的样板文件,否则需要:
case-let-n,其中n%3==0: