1. 扩展
示例:一个数的平方
// 好的版本
func square(x: Int) -> Int { return x * x }
var squaredOFFive = square(x: 5)
square(x:squaredOFFive) // 625
无用的变量被创建出来表示 5 的平方—我们不需要享受打字的过程。
// 更好的版本
extension Int {
var squared: Int { return self * self }
}
5.squared // 25
5.squared.squared // 625
扩展课程
2. 一般
示例: 打印数组中所有元素
// 糟糕的代码
var stringArray = ["Bob", "Bobby", "SangJoon"]
var intArray = [1, 3, 4, 5, 6]
var doubleArray = [1.0, 2.0, 3.0]
func printStringArray(a: [String]) { for s in a { print(s) } }
func printIntArray(a: [Int]) { for i in a { print(i) } }
func printDoubleArray(a: [Double]) {for d in a { print(d) } }
太多无用的函数。让我们只创建一个。
// 很棒的代码
func printElementFromArray<T>(a: [T]) {
for element in a { print(element) }
}
3. For 循环 vs While 循环
示例:打印 5 次 "Count"
// 好的代码
var i = 0
while 5 > i {
print("Count")
i += 1
}
你创建了变量 "i" 来确保计算机不会因打印有限的数字而中断
听着,更多的变量 → 更多的内存 → 更头疼 → 更多的错误 → 更多生活难题。
记住蝴蝶效应。
// 更好的代码
for _ in 1...5 { print("Count") }
"华丽" --- Bob
4. 可选值解包
示例: Gaurd let vs if let
编写一个欢迎新用户的程序。
var myUsername: Double?
var myPassword: Double?
// 糟糕的代码
func userLogIn() {
if let username = myUsername {
if let password = myPassword {
print("Welcome, \(username)"!)
}
}
}
看见宛如厄运金字塔般的代码了吗?这些代码层层嵌套。放弃这种写法。尝试用一种更优雅的方式实现吧。
// 优雅的代码
func userLogIn() {
guard let username = myUsername, let password = myPassword
else { return }
print("Welcome, \(username)!")
}
这个区别很明显。如果 username 或 password 值为空,优雅的代码(指下面的代码)将执行返回提前退出函数。 如果值不为空,程序将输出欢迎信息。代码不会繁冗。
5. 计算属性 vs 函数
示例:找出圆的直径
// 代码
func getDiameter(radius: Double) -> Double { return radius * 2}
func getRadius(diameter: Double) -> Double { return diameter / 2}
getDiameter(radius: 10) // return 20
getRadius(diameter: 200) // return 100
getRadius(diameter: 600) // return 300
你创建了两个相互独立的函数。穷凶极恶!让我们将半径和直径联系起来。
// 好的代码
var radius: Double = 10
var diameter: Double {
get { return radius * 2}
set { radius = newValue / 2}
}
radius // 10
diameter // 20
diameter = 1000
radius // 500
现在,半径和直径变量彼此相互依赖。更多的联系 → 减少额外的打字 → 更少的错别字 → 更少的问题 → 更少的生活难题。
6. 类型安全的枚举
示例:卖票
// 简直糟糕
switch person {
case "Adult": print("Pay $7")
case "Child": print("Pay $3")
case "Senior": print("Pay $4")
default: print("You alive, bruh?")
}
"Adult", "Child", "Senior" → 你在硬编码。你实际上是为每种情况键入所有这些字符串值。不行不行。我解释了当你写得太多时会发生什么。我们从来不享受打字。
// 优雅的代码
enum People { case adult, child, senior }
var person = People.adult
switch person {
case .adult: print("Pay $7")
case .child: print("Pay $3")
case .senior: print("Pay $4")
}
你将不会写错别字,因为".adult", ".child", ".senior" 是高亮显示的。如果 switch 语句遇到超出设计过的枚举的未知情况,Xcode 将在左侧用红色错误( )醒目地提醒—我只是没有找到正确的表情。
7. Nil 合并
示例:用户选择 Twitter 的主题颜色
// 冗长的代码
var userChosenColor: String?
var defaultColor = "Red"
var colorToUse = ""
if let Color = userChosenColor { colorToUse = Color } else
{ colorToUse = defaultColor }
太长了吧。让我们来为它瘦身。
// 着实简洁
var colorToUse = userChosenColor ?? defaultColor
上面的代码表示,如果 userChosenColor 返回 nil,选择 defaultColor( red )。 否则,选择 userChosenColor。
8. 条件合并
示例:如果你有尖尖的头发就增加高度
// 简直啰嗦
var currentHeight = 185
var hasSpikyHair = true
var finalHeight = 0
if hasSpikyHair { finalHeight = currentHeight + 5}
else { finalHeight = currentHeight }
太长了,瘦身。
// 优雅的代码
finalHeight = currentHeight + (hasSpikyHair ? 5: 0)
上面的代码表示,如果 hasSpikeHair 是 true,finalHeight 加 5,否则加 0。
9. 函数式编程
示例:获取偶数
// 命令式 (也称为无聊式)
var newEvens = [Int]()
for i in 1...10 {
if i % 2 == 0 { newEvens.append(i) }
}
print(newEvens) // [2, 4, 6, 8, 10]
我不需要看整个过程。我在浪费时间去回顾你的 for 循环是怎样的。让我们明确它。
// 声明式
var evens = Array(1...10).filter { $0 % 2 == 0 }
print(evens) // [2, 4, 6, 8, 10]
函数式编程是惊人的。
函数式编程使你看起来很聪明。
10. 闭包和方法
// 普通的方法
func sum(x: Int, y: Int) -> Int { return x + y }
var result = sum(x: 5, y: 6) // 11
你不需要记住任何与方法有关的名字和变量——你只需要一个美元符 $
// 闭包
var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
sumUsingClosure(5, 6) // 11
是不是超酷的!
网友评论