成为优秀 Swift 开发者的 10 条建议 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lfj
V2EX    iOS

成为优秀 Swift 开发者的 10 条建议

  •  
  •   lfj 2016-11-24 14:59:50 +08:00 2411 次点击
    这是一个创建于 3251 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在这里给大家分享一些帮助大家成为更优秀的 Swift 开发者的建议,让你的代码,写的更少,性能更优 。

    1. Extension 扩展

    举例:平方

    // Okay Version func square(x: Int) -> Int { return x * x } var squaredOFFive = square(x: 5) square(x:squaredOFFive) // 625 

    创建无效变量,将 5 平方后再平方 毕竟我们不喜欢打字。

    // Better Version extension Int { var squared: Int { return self * self } } 5.squared // 25 5.squared.squared // 625 2. Generics 泛型 

    举例:打印数组中的所有元素

    // Bad Code 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) } } 

    对于很多无效的函数,我们只需创建一个就可。

    // Awesome Code func printElementFromArray<T>(a: [T]) { for element in a { print(element) } } 

    3. For 循环 vs While 循环

    举例:打印 5 次 “ Count ”

    // Okay Code var i = 0 while 5 > i { print("Count") i += 1 } 

    创建变量“ i ”以确保你电脑打印有限的数字不会崩溃。

    要记住:变量越多 → 记忆越多 → 越麻烦 → bug 越多 → 问题越多。蝴蝶效应要谨记

    // Better Code for _ in 1...5 { print("Count") } 

    4. 有选择的展开

    举例: 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)"!) } } } 

    你看到世界末日的金字塔了吗?嵌套的代码太让人讨厌了。坚决不要!把糟糕的代码去掉,改成更好的。

    // Pretty Code func userLogIn() { guard let username = myUsername, let password = myPassword else { return } print("Welcome, \(username)!") } 

    上下两者的差别是显而易见的。如果用户名或密码有一个零值,优雅的代码会调用“ return ”提前退出。否则,会出现欢迎的信息。

    5. 计算属性 vs 函数

    举例:求圆的直径

    // 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 

    上面创建了两个互斥函数。太糟糕了!我们将半径和直径之间的点连接起来。

    // 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 

    现在,半径和直径变量是互相独立的。连接越多 → 额外输入越少 → 错误更少 → bug 越少 → 问题越少。

    6. 类型安全枚举

    举例:售票

    // Simply Bad switch "Adult" { case "Adult": print("Pay $7") case "Child": print("Pay $3") case "Senior": print("Pay $4") default: print("You alive, bruh?") } 

    “ Adult ”, “ Child ”, “ Senior ” → 这是在硬编码,逐一地将每个情况的字符串打出来,万万不可。上面已经解释过,写太多会出什么问题。我们可一点都不喜欢打字。

    // Beautiful Code enum People { case adult, child, senior } switch People.adult { case .adult: print("Pay $7") case .child: print("Pay $3") case .senior: print("Pay $4") default: print("You alive, bruh?") } 

    “.adult ”, “.child ”, “.senior ” 重点标注肯定是没错的。如果 switch 语句超过指定枚举的范围遇到一些未知情况,左边发生红色错误(), Xcode 会报警。 找不到合适的表情啦。

    7. 无效合并

    举例:用户选择 Twitter 主题色

    // Long Code var userChosenColor: String? var defaultColor = "Red" var colorToUse = "" if let Color = userChosenColor { colorToUse = Color } else { colorToUse = defaultColor } 

    这代码太长了,我们缩短一下。

    // Concise AF var colorToUse = userChosenColor ?? defaultColor 

    上边代码的意思是,如果 userChosernColor 返回零值(无效),选择 defaultColor (red),否则,选择 userChosenColor.

    8. 有条件的合并

    举例:鸡冠头( SpikyHair )显高

    // Simply Verbose var currentHeight = 185 var hasSpikyHair = true var finalHeight = 0 if hasSpikyHair { finalHeight = currentHeight + 5} else { finalHeight = currentHeight } 

    上面的代码太长了,我们来给它瘦瘦身。

    // Lovely Code finalHeight = currentHeight + (hasSpikyHair ? 5: 0) 

    上面的代码意思是,如果 hasSpikeHaire 是真实的,最后的高度增加 5 ;如果是假的,最后的高度加 0 (不增加)。

    9. 函数式编程

    举例:获取偶数

    // 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] 

    不需要了解全过程。 review 上面的 for 循环太浪费时间了,其实可以更清晰一些。

    // Declarative 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 

    以上就是要介绍的 10 条技巧,希望对大家有所帮助。如果有哪里不对,一定要评论给我呀,我们一起进步啊~~

    见我的专栏 https://zhuanlan.zhihu.com/intech-porter 文章来源: https://medium.com/ios-geek-community/10-tips-to-become-better-swift-developer-a7c2ab6fc0c2#.mj7165jnl

    soli
        1
    soli  
       2016-11-24 16:07:58 +08:00
    『创建无效变量,将 5 平方后再平方』
    『对于很多无效的函数,我们只需创建一个就可』

    这两句里的『无效』是什么意思?

    第二节的标题跑到前面的代码段里去了。
    lfj
        2
    lfj  
    OP
       2016-11-24 19:32:42 +08:00
    @soli invalid 这个翻译成 无效 可以吗? 啊呀,窝草啊,果然标题进去了,我怎么改,现在是没法改过来啊啊啊啊 /(ㄒoㄒ)/~~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2725 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 14:00 PVG 22:00 LAX 07:00 JFK 10:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86