问题:找出1~100中所有能被3整除,或者能被5整除,或者既能被3整除又能被5整除的数。
如果只是单纯的问题求解,那么这个答案就比较简单了,只要逻辑捋顺畅了,用常规的for ... in
循环就可以解决:
func challenge() {
for i in 1...100 {
if i % 3 == 0 && i % 5 == 0 {
print("\(i)既可以被3整除,又可以被5整除")
} else if i % 3 == 0 {
print("\(i)可以被3整除")
} else if i % 5 == 0 {
print("\(i)可以被5整除")
} else {
print("\(i)既不能被3整除,又不能被5整除")
}
}
}
challenge()
还是用for ... in
循环和逻辑分支,我再给一个答案。不要小看这一个答案,因为它对我们后面嵌套三目运算符的理解很有帮助:
func challenge1() {
for i in 1...100 {
if i % 3 == 0 {
if i % 5 == 0 {
print("\(i)既可以被3整除,又可以被5整除")
} else {
print("\(i)可以被3整除")
}
} else if i % 5 == 0 {
print("\(i)可以被5整除")
} else {
print("\(i)既不能被3整除,又不能被5整除")
}
}
}
challenge1()
如果你看过我前面的这个系列的笔记,就应该知道,问题不应该就这么简单对不对?所以我下面要给一个装逼的答案:
func challenge2() {
(1...100).forEach {
print($0 % 3 == 0 ? $0 % 5 == 0 ? "\($0)既可以被3整除,又可以被5整除" : "\($0)可以被3整除" : $0 % 5 == 0 ? "\($0)可以被5整除" : "\($0)既不能被3整除,又不能被5整除")
}
}
challenge2()
上面的代码看起来非常简洁,但是有点鬼畜对不对?其实主要是用到了两个知识点:一个是forEach(_: )
函数;另外一个就是三目运算符的嵌套,它承包了所有的鬼畜。下面我们将对这两个知识点做重点讲解。
先来看forEach(_: )
函数。它接收一个闭包作为其参数,实际功能和for ... in
循环差不多,都可以对某个序列进行遍历,并且遍历的结果一致。但是,forEach(_: )
函数又与for ... in
循环有两个明显的区别:
1、不能在
forEach(_: )
函数的闭包中使用break
或continue
语句;
2、可以在forEach(_: )
函数的闭包中使用return
语句退出当次调用
我们把forEach(_: )
函数闭包中省略的参数名给补上,这样一来就容易理解多了:
func challenge2() {
(1...100).forEach { (num) in
print(num % 3 == 0 ? num % 5 == 0 ? "\(num)既可以被3整除,又可以被5整除" : "\(num)可以被3整除" : num % 5 == 0 ? "\(num)可以被5整除" : "\(num)既不能被3整除,又不能被5整除")
}
}
challenge2()
接下来再看那一坨鬼畜的嵌套三目运算符。其实三目运算符的本质还是if-else
结构的变体,如果你确实不明白,可以考虑给它加小括号,就跟我们刚开始学习运算符优先级的时候一样,它可以有效的帮助你减少懵逼:
print(num % 3 == 0 ? (num % 5 == 0 ? "\(num)既可以被3整除,又可以被5整除" : "\(num)可以被3整除") : (num % 5 == 0 ? "\(num)可以被5整除" : "\(num)既不能被3整除,又不能被5整除"))
我特意用小括号和多个空格将嵌套三目运算符的逻辑结构做了一个区隔,这样以来,你很容易就能发现,它其实就是上面第二种答案的逻辑结构,只不过我们将if-else
用三目运算符给替换了。
网友评论