

帮你成为更好的Swift开发者的10个Tips(译)
source link: https://www.tuicool.com/articles/q2aaeef
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

你是否已经用Swift开发了几个月,现在,你想成为一个更好的Swift开发者?少年,你来对了地方,我这里有一本失传多年的武林秘籍传授于你。 不要在意代码的格式,我想尽我所能保持代码的简洁。以至于可以是你方便的拷贝到playground来进行代码验证
。
废话不多说,让我们愉快的开始一段Swift体验之旅吧。
1、Extension
求平方
-
普通版本
func square(x: Int) -> Int { return x * x } var squaredOFFive = square(x: 5) square(x:squaredOFFive) // 625复制代码
-
进阶版本
extension Int { var squared: Int { return self * self } } 5.squared // 25 5.squared.squared // 625复制代码
总结
-
普通版本如果想要对同一个数进行多次求平方,还需要创建多余的局部变量,而且代码比较冗余。
-
进阶版本通过给
Int
添加一个extension,然后在extension中给Int
添加一个计算属性
。这样无需创建多余的局部变量即可获取平方值。 关于计算属性相关知识可以点此了解
2、Generics
-
普通版本
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(a: [T]) { for element in a { print(element) } }复制代码
总结
-
普通版本:每个类型都要定义一个function,但是每个function的功能都是一样的,这样就造成了代码冗余。
-
进阶版本:只定义一个function,每个类型都可以使用。
3、For Loop vs While Loop
输出“Count”5次
-
普通版本
var i = 0while 5 > i {print("Count") i += 1 }复制代码
-
进阶版本
for _ in 1...5 { print("Count") }复制代码
总结
-
当我们不需要使用循环中的变量时,我们可以使用
For Loop
和_
来代替While Loop
。 -
记住:变量越多->问题越多->bug越多。
4、Optional Unwrapping
Gaurd let vs if let(新用户登录逻辑)
-
普通版本
var myUsername: Double? var myPassword: Double? // Hideous Code 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)!") }复制代码
译者注:
//上述的普通版本也可写成这种形式if let username = myUsername, let password = myPassword { print("Welcome, \(username)"!) }复制代码
总结
-
普通版本代码结构嵌套冗余,进阶版本更加一目了然。
-
在判断一些前提必要条件的时候,推荐使用
guard let
, 详情参见文档
5、Computed Property vs Function
计算直径
-
普通版本
// ???? Code 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 radi = 10.0 var dia = getDiameter(radius: radi) // 20 dia = 30.0 // 30 radi // 10.0 此处必须调用getRadius函数radius的值才会改变复制代码
-
进阶版本
// Good Code var radius: Double = 10 var diameter: Double { get { return radius * 2} set { radius = newValue / 2} } radius // 10 diameter // 20 diameter = 1000 radius // 500复制代码
总结
-
普通版本:创建了两个互转函数,代码冗余且没有对radius和diameter建立内在联系。当你修改diameter的时候,相应的radius并没有跟着修改。
-
进阶版本:通过计算属性实现两者内在逻辑关联,当diameter改变的时候,radius会跟随相应改变。
6、Enum to Type Safe
买票
-
普通版本
switch person { case "Adult": print("Pay $7") case "Child": print("Pay $3") case "Senior": print("Pay $4") default: print("You alive, bruh?") }复制代码
-
进阶版本
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") }复制代码
总结
-
普通版本:通过硬编码的方式来判断字符串,不易维护且代码可读性不高。很可能漏掉某个条件而造成bug。
-
进阶版本:创建
enum
来实现所有条件,当你在switch中漏掉某个case的时候,编译器会提示错误,强制你判断所有case。这样可以减少bug,使代码更健壮。
7、Nil Coalescing
选择颜色
-
普通版本
var userChosenColor: String? var defaultColor = "Red"var colorToUse = ""if let Color = userChosenColor { colorToUse = Color } else { colorToUse = defaultColor }复制代码
-
进阶版本
var colorToUse = userChosenColor ?? defaultColor复制代码
总结
-
使用
??
设置可选类型变量的默认值,减少冗余代码。
8、Conditional Coalescing
计算height
-
普通版本
// Simply Verbose var currentHeight = 185 var hasSpikyHair = truevar finalHeight = 0if hasSpikyHair { finalHeight = currentHeight + 5} else { finalHeight = currentHeight }复制代码
-
进阶版本
// Lovely Code finalHeight = currentHeight + (hasSpikyHair ? 5: 0)复制代码
总结
-
通过三目运算符来减少代码量,使逻辑更加清晰。
9、Functional Programming
获取偶数值
-
普通版本
// Imperative (a.k.a boring) var newEvens = [Int]()for i in 1...10 { if i % 2 == 0 { newEvens.append(i) } }print(newEvens) // [2, 4, 6, 8, 10]复制代码
-
进阶版本
var evens = Array(1...10).filter { $0 % 2 == 0 }print(evens) // [2, 4, 6, 8, 10]复制代码
总结
-
使用
filter
替代上面的For-Loop
。这里也推荐大家更多的使用高阶函数。
10、Closure vs Func
-
普通版本
// Normal Function func sum(x: Int, y: Int) -> Int { return x + y } var result = sum(x: 5, y: 6) // 11复制代码
-
进阶版本
// Closure var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 } sumUsingClosure(5, 6) // 11复制代码
Recommend
-
11
Javascript 常用代码优化和重构的方法 主要介绍以下几点: 合并重复的条件片段 把条件分支语句提炼成函数 ...
-
7
10个维度,4种手段,帮你搞定用户分层 十里村 • 2021-04-19 20:45:56 来源:十里村 E1993G1...
-
7
更好地进行远程工作的10个技巧 责任编辑:cres 作者:Carla Rudder | 2021-05-13 13:54:03 原创文章 企业网D1Net 到目前为止,很多人已经采用了一些在家远程工作时如何提高工作效率的方法。员工可...
-
28
你想做区块链?讲师帮你更好理解区块链的商业逻辑!让我们一起报名EMBA国际总裁班学习吧~ 北邮区块链张权 · 2017-08-08 10:05:15 · 6520 次点击 · 预计阅读时间 2 分钟...
-
7
人生的过程是动态的,我们在不同的阶段都有不同的动态曲线,根据这些曲线能够更高的找到方向感;本文作者分享了8条动态曲线模型,帮你更好的和这个动态世界相处,我们一起来了解一下。
-
12
牛市还在吗?这10个指标帮你下判断
-
6
十条设计贴士,帮你塑造更好的iOS应用整体体验 2013年的第一篇,也不知道是不是有什么可以庆贺和纪念的。这个假期没少下雪,印象里在1号之后就没见过太阳的样子了;倒是这样夜晚的时候灯光昏...
-
4
表单篇 | 掌握基本原则,帮你设计出更好的表单!-经验/观点-UICN用户体验设计平台 表单篇 | 掌握基本原则,...
-
8
我使用 vue 已经很多年了,特别是去年一直在使用 Vue3,因此,学到了很多东西。1、脚本设置如果以前使用过组合 api,我...
-
5
不会做图表?10个Python数据可视化库来帮你! 2022-09-21 13:24:46 想做数据可视化,自然离开不了数据可视化库。今天我给大家介绍一下10个适用于多个学科的Python数据可视化库,其中有名气很大的也有鲜为人知的。...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK