屈指算来,Swift语言才发布半年左右,却已深得众多开发者的青睐,也有了许许多多的学习资源、项目和工具。在本文中,来自objc.io、LinkedIn等各个公司的软件工程师及资深开发者总结了自己在接触Swift过程中最喜爱的贴士与技巧,有些技巧即使是很早就入坑Swift的开发者都不知道,不妨一起来了解一下吧。
Natasha Murashev——Capital One iOS工程师、Natasha The Robot博主
当我在构建iOS应用时,Swift能够允许更多的函数式编程方法,所以,为了能在改善Swift代码时做出更好的决策,我一直在学习函数式编程。迄今为止,我最喜欢的函数方面的Swift资源有:
- 功能型函数——能轻松更改函数,让代码更独立、可测试。
- 包装类型——我喜欢用可读且安全的类型别名来编写代码。
- 类型设计——在设计程序时大幅使用正确的类型,有利于编译器调试。
- Swift中柯里化函数的运用——在Haskell中,某种类型的函数指针只能指向特定参数类型和数目以及返回值类型的函数,而Swift则允许“currying”或部分应用函数,从而实现代码块可重复使用。
- Swift奇妙的差错处理——与Objective-C相比,我特别喜欢这种简单、可读性强而又安全的错误处理方式。
- 面向对象编程直达车——它为在代码中进行错误处理提供了一种最快捷的方式,于程序猿而言,最幸福之事莫过于此。
- Swift函数式编程——这是一本关于Swift函数比较深度的书籍,我每次重新读过时都会发现不一样的点,非常适合想要深入研究Swift函数以及如何将其运用到iOS代码中的开发者们阅读。
Chris Eidhof——objc.io创始人、《Swift函数式编程》作者
快速排序(Quicksort)——Swift中的快速排序实现可以说是前无古人后无来者,大多数Quicksort实现都需使用固定的内存,而Swift则能以最简洁清晰的程序实现快排:
1 | func qsort(input: [Int]) -> [Int] { |
2 | if let (pivot, rest) = input.decompose { |
3 | let lesser = rest.filter { $ 0 < pivot } |
4 | let greater = rest.filter { $ 0 >= pivot } |
5 | return qsort(lesser) + [pivot] + qsort(greater) |
Austin Zheng——LinkedIn高级软件工程师
我认为,精妙的Swift技巧应当如此:开发者可以通过创建一个已定义标准类的闭包来为匿名类实例设置委托,而闭包则将返回该类的一个新实例,并运行。示例代码如下:
02 | protocol SomeDelegateProtocol : class { |
03 | func firstFunc() -> String |
04 | func secondFunc() -> Bool |
07 | weak var delegate : SomeDelegateProtocol? |
11 | var strongDelegate : SomeDelegateProtocol? = nil |
15 | class SomethingClass : SomeDelegateProtocol { |
16 | func firstFunc() -> String { return "foo" } |
17 | func secondFunc() -> Bool { return true } |
19 | return SomethingClass() |
21 | child.delegate = strongDelegate |
24 | self .child = MyClass() |
29 | var result = bleh.child.delegate?.firstFunc() |
30 | println( "Got \(result!)" ) |
Clay Smith——PagerDuty高级软件工程师
下面是我在处理所有Xcode问题(尤其是sourcekit)时所使用的最基本的Bash alias(命令别名),用来删除Xcode中的Derived Data:
1 | alias sourcekitsad= 'rm -rf ~/Library/Developer/Xcode/DerivedData' |
Michael Helmbrecht——Motiv UX设计师兼iOS开发者
于我而言,最喜欢的一点应该是Swift能在String类型和NSString类型中自动转换,当无法打印String时,通过直接调用NSString的-description方法即可实现。
David Kobilnyk——ShopRunner软件工程师
作为一门编程语言,我觉得Swift还不够优雅,而我也并没有发现什么太特别的技巧,只是很喜欢原始类型、枚举一起使用,就像这样:
01 | public enum ReminderTimeType: String { |
02 | case Evening = "this evening" |
03 | case Tomorrow = "tomorrow" |
04 | case Weekend = "this weekend" |
05 | case NextWeek = "next week" |
06 | case CoupleWeeks = "in a couple weeks" |
07 | case CoupleMonths = "in a couple months" |
08 | case Someday = "someday" |
09 | public static let array = [ |
10 | Evening, Tomorrow, Weekend, NextWeek, CoupleWeeks, CoupleMonths, Someday |
12 | public static let rawArray = array.map { $ 0 .rawValue } |
Alexis Gallagher——高级iOS开发者
要说我最喜欢的Swift技巧,应该有两个,一个是在REPL中,handy函数可直接用于获取表达式静态类型,而想要获取任意实例值的类型名称则可直接调用_stdlib_getDemangledTypeName。
1 | func typeof<T>( @autoclosure () -> T) -> Any. Type { return T. self } |
JP Simard——Realm iOS工程师
开发者可以直接使用nm工具通过libswiftCore.dylib来获取所有私有的Swift标准库函数,比如_stdlib_getTypeName()、_stdlib_demangleName()和_stdlib_conformsToProtocol():
1 | cd `xcode-select -p`/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx |
2 | nm -a libswiftCore.dylib | grep "T _swift_stdlib_" |
Warren Moore——《Metal By Example》作者
当结构体中的所有成员属于同一类型时(比如浮点型),通过Swift,开发者可以将其中的同类数组作为一个指针指向结构体中的成员类型。这一方法,让我能够非常简便地去创建顶点数据的Metal缓冲区,而无需其他多余的复杂操作。
Mustafa Furniturewala——Coursera软件工程师
我最喜欢的Swift资源是Swifter,对我来说,它是编程必备的参考指南,而最喜欢的技巧则是开发者可以使用任意的Swift函数来实现Objective-C风格的动态分配。
(编译/唐小引 责编/刘璐璐)
文章来源:Realm