本教程翻译自http://www.raywenderlich.com 原文链接 ——转载请注明。
Swift语言发布有一段时间了,因目前的项目都不使用Swift所以也没有去系统的学习,翻译本教程的目的是加深自己的理解,同时希望能帮到更多有意学习Swift的童鞋。
注:本教程使用的IDE是Xcode 6。本教程只是Swift入门教程,了解更详细更权威信息,请阅读Apple的Swift reference guide
A Quick Start
1.使用Playgrounds
<span style="font-size:14px;">let tutorialTeam = 56
let editorialTeam = 23
let totalTeam = tutorialTeam + editorialTeam</span>
2.Swift中的变量和常量
把下面这行代码加到你的playground文件中:
<span style="font-size:14px;">totalTeam += 1</span>
加上这行playground会报错,这是因为totalTeam是一个常量,这意味着它的值永远不能改变。常量使用关键词let声明。
如果你想让totalTeam的值可以改变,使用关键词var声明它为变量。
<span style="font-size:14px;">let tutorialTeam = 56</span>
把初始化totalTeam的代码替换成下面这行:
<span style="font-size:14px;">var totalTeam = tutorialTeam + editorialTeam</span>
现在不报错了,你可能会想“为什么不全都用var来声明,这样会有更少的限制?”。事实上,你应该尽可能的使用let声明,这样才能让编译器优化。所以记住:尽量用let声明。
3.显示和推断类型(Explicit vs. Inferred Typing)
目前为止你还没有显示的为这些变量和常量设置任何类型,因为编译器有足够的信息去自动推断它的类型。例如,因为你设置tutorialTeam为56,编译器知道56是int类型,所以它自动为你把tutorialTeam设置为int。
然而,你也可以显示的设置类型,把设置tutorialTeam的那行代码替换成下面这行:
<span style="font-size:14px;">let tutorialTeam: Int = 56</span>
你可能会疑惑什么时候显示设置类型,什么时候让编译器为你推断类型。我们认为应该尽可能的让编译器自动推断,因为这样你就会得到Swift语言的一个主要的优势,简洁和容易的去读代码。
因此把这一行改成推断类型:
<span style="font-size:14px;">let tutorialTeam = 56</span>
4.Swift中的基本类型和控制流
Floats和Doubles
<span style="font-size:14px;">let priceInferred = 19.99
let priceExplicit: Double = 19.99</span>
有两个类型来表示小数的值,Float和Double.Double拥有更高的精度,也是推断小数的默认类型。这意味着priceInferred也是Double类型的。
Bools
<span style="font-size:14px;">let onSaleInferred = true
let onSaleExplicit: Bool = false</span>
需要注意的是,在Swift中使用true/false来为boolean类型的变量赋值(不像在OC中习惯使用的YES/NO).
Strings
<span style="font-size:14px;">let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"</span>
String类型正如你所期待的,不再使用@作为前缀了,这可能得让习惯了OC的你们适应一会。
If和字符串插入(string interpolation)
<span style="font-size:14px;">if onSaleInferred {
println("\(nameInferred) on sale for \(priceInferred)!")
} else {
println("\(nameInferred) at regular price: \(priceInferred)!")
}</span>
条件判断语句的括号是可选的,但是花括号是必须的,即使只有一行代码。
上面这段代码也展示了一种名为字符插入的新技术,在任何你想代替字符串的地方使用语法:\(your expression)。
5.类和方法
在Swift项目中你最常做的事情就是创建类和方法,所以我们直奔主题。
首先,删除playgorund中之前写的代码。
接下来,你将要创造一个小费计算器来帮你计算在餐厅里应该付多少小费。你将会每次添加一小块代码,每一步我都会详细的解释。
<span style="font-size:14px;">class TipCalculator {
}</span>
创建类的时候只需要使用class关键字和你的类名,然后使用花括号包住类体。
如果你的类继承自另一个类,在你的类名之后加上冒号然后键入需要继承的类名。注意:你的类可以不继承自任何类(在Objective-C中,必须继承自NSObject或者其他类)。
在花括号内加入:
<span style="font-size:14px;"> let total: Double
let taxPct: Double
let subtotal: Double</span>
上面的代码在类中创建了属性(properties)方法和创建常量与变量一样。这里你创建了三个常量属性。注意:声明的任何属性在声明的时候必须设置初始值,或者在初始化器中设置。否则必须声明为可选的(optional)。
把下面这段代码加入花括号内最底部:
<span style="font-size:14px;">init(total:Double, taxPct:Double) {
self.total = total
self.taxPct = taxPct
subtotal = total / (taxPct + 1)
}</span>
这段代码为这个类创建了带有两个参数的初始化器,在Swift中初始化器总是命名为init,你可以创建多个,但是必须带有不同的参数。
需要注意的是我初始化器参数的命名和类的属性名一样,为了区分两者我需要在属性名之前加上self前缀。
还需要注意的是没有和subtotal这个属性冲突的参数名,不需要加self关键词,因为编译器会自动推断。
在上段代码之后加入:
<span style="font-size:14px;">func printPossibleTips() {
println("15%: \(calcTipWithTipPct(0.15))")
println("18%: \(calcTipWithTipPct(0.18))")
println("20%: \(calcTipWithTipPct(0.20))")
}</span>
这是可以打印三种可能小费的新方法。
注意:调用方法的构造器时,第一个参数不必命名(其他参数必须命名)。
注意字符串插入是如何打印出变量的,在字符串插入中你可以调用任何复杂的函数。
在花括号之后加入:
<span style="font-size:14px;">let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()</span>
终于,你创建了这个小费计算器类的实例,并且调用了打印小费的方法。现在,你的playground应该是这样的:
<span style="font-size:14px;">class TipCalculator {
// 2
let total: Double
let taxPct: Double
let subtotal: Double
// 3
init(total:Double, taxPct:Double) {
self.total = total
self.taxPct = taxPct
subtotal = total / (taxPct + 1)
}
// 4
func calcTipWithTipPct(tipPct:Double) -> Double {
return subtotal * tipPct
}
// 5
func printPossibleTips() {
println("15%: \(calcTipWithTipPct(0.15))")
println("18%: \(calcTipWithTipPct(0.18))")
println("20%: \(calcTipWithTipPct(0.20))")
}
}
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()</span>
看看右边输出的结果是不是正确。
6.数组(Array)和for循环(For Loops)
上面的代码中有些是重复的,因为你使用不同的小费百分比调用了几次calcTipWithTotal方法。可以使用Array来精简重复的代码。
把printPossileTips方法内的代码用下面的代码替换:
<span style="font-size:14px;">let possibleTipsInferred = [0.15, 0.18, 0.20]
let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]
for possibleTip in possibleTipsInferred {
println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}</span>
上面两行代码非别用推断类型和显式类型创建了Double类型的数组,[Double]是Array<Double>的简写。
遍历数组中的元素很像Objective-C中得快速遍历,但是不需要括号。
这个For循环也可以这样写:
<span style="font-size:14px;">for i in 0..<possibleTipsInferred.count {
let possibleTip = possibleTipsInferred[i]
println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}</span>
操作符 ..< 是non-inclusive范围运算符,不包含上边界。而操作符 ... 包含上边界。Array有一个count属性表示元素个数。可以使用arrayName[index]语法获取数组中特定位置的元素。
7.字典类型(Dictionaries)
让我们最后一次修改我们的小费计算器,相比简单的打印出小费,你可以返回一个带有结果的字典。在开发应用时这种格式的数据更易被展示在界面上。
删除printPossibleTips方法,用下面的替换:
<span style="font-size:14px;">// 1
func returnPossibleTips() -> [Int: Double] {
let possibleTipsInferred = [0.15, 0.18, 0.20]
let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]
// 2
var retval = Dictionary<Int, Double>()
for possibleTip in possibleTipsInferred {
let intPct = Int(possibleTip*100)
// 3
retval[intPct] = calcTipWithTipPct(possibleTip)
}
return retval
}</span>
我们一步一步分析这段代码:
1.这个方法返回一个字典,字典的key是一个Int型值,value是一个Double型值。[Int: Double]是Dictionary<Int,Double>的简写。
2.这里你创建了一个空的字典,因为你需要更改这个 字典的值,所以你必须把这个字典声明为变量而不能是常量,否则编译器会报错。
3.为字典设置值(set an item in a dictionary)和Objective-C很像。
最后,修改最后一行:
tipCalc.returnPossibleTips()
当playground计算之后,你可以看到这个字典的值。
恭喜你,现在你已经使用Swift创建了一个全功能的消费计算器!
何去何从?
这里是本教程的最终版playground file.
想学习更多Swift知识?请继续阅读本系列的下一节。
希望你喜欢本教程,也欢迎进入Swift世界!:]
本人才疏学浅,Swift也仅仅是入门,错误在所难免,望轻拍!——译者注