41

帮你成为更好的Swift开发者的10个Tips(译)

 5 years ago
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.
neoserver,ios ssh client

你是否已经用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]复制代码

总结

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK