Swift是苹果的品牌新的编程语言,在2014年WWDC(苹果开发者大会)上发布的编程语言。
随着Swift语言的发布,苹果也发布了一个出色的SWIFT的参考指南,这里强烈推荐。
但是这个学习指南又长又瘦!所以,如果没有很多的时间,只是想快速学习Swift,那么本教程就是为你准备的。
本 Swift 教程将需要大约25分钟学习,给出 Swift 语言一个快速浏览,包括变量,控制流,类等以及更多的最佳实践。
对于本Swift教程,需要Xcode最新版本(在写这篇Swift教程的时候使用的是Xcode 6.1.1)。学习本教程之前不需要任何Swift和Objective-C的经验,但如果有一些编程经验,但这会对理解和学习有帮助。
注意: 请确保有最新的Xcode(在Mac App Store检查以确保)。Swift正在发生迅速的变化,我们正在竭尽所能为每一个测试版更新本教程; 代码可能无法正常工作在旧版本的Xcode中的或预发行版本中。
Playgrounds简介
启动 Xcode 6, 并转到 File/New/File. 选择 iOS/Source/Playground, 并点击 Next.
命名文件为 SwiftTutorial.playground, 并点击 Create, 并保存在一个方便的地方. 删除其它不用的文件,以保持一个干净的文件目录.
playground 是一种文件类型,并且允许测试 Swift 代码, 可以侧边栏查看每一行的结果. 例如:添加以下行到 playground 中:
let tutorialTeam = 60
let editorialTeam = 17
let totalTeam = tutorialTeam + editorialTeam
当编写输入这些行,会看到侧边栏上的每一行的结果。是不是很方便?
Playgrounds是学习Swift一个很好的方式(比如这个Swift教程)来试验新的API,原型代码或算法,或可视化绘制代码。 在本Swift教程的其余部分,将使用 playground。
注意: 在这一点上,建议拖动playground文件(SwiftTutorial.playground)到OS X Dock中。
通过这种方式,可以测试一些代码,Swift使用此文件作为一个快速的暂存器。 当然,对于这个工作,必须有playground在一个地方,不能随便移动它。
Swift变量VS常量
尝试添加下面一行到 playground 的底部:
totalTeam += 1
当加入这一行,会发现有一个错误。 这是因为 totalTeam 是一个常数,这意味着它的值永远不会改变。Swift中使用关键字 let 声明常数。
如果想要 totalTeam 是一个变量,它的值可以随时被改变 - 声明它需要用不同的关键字: var。
要做到这一点,初始化 totalTeam 使用以下行来替换之前的声明:
var totalTeam = tutorialTeam + editorialTeam
现在它能正常工作了!可能就会像你自己认为的那样了,“为什么不使用var声明一切呢,无需有那么多的限制?”
好吧,使用 let 来声明一个常量是最好的做法,因为这允许编译器进行优化。所以请记住:尽可能使用 let 来声明常量!
显式与推断输入
到目前为止,还没有明确设置这些常量和变量的类型,因为编译器有足够的信息来自动推断出它。
例如,设置 tutorialTeam 为 56,编译器知道56是一个int类型,所以它会自动设置oftutorialTeam类型为int。
但是,如果你想要也可以设置明确类型。尝试通过设置tutorialTeam的类型如以下的行:
let tutorialTeam: Int = 60
如果不知道明确类型,或者让编译器推断类型并自动设置。这是比较好的做法,可在自动情况下让编译器推断出类型,因为这是 Swift 的主要优势之一:简洁,易于代码阅读。
因为这个,切换回之前的那行使用推断输入(自动识别类型):
let tutorialTeam = 60
Swift基本类型和控制流
到目前为止,已经看到了 Int 的解释,这是Swift用于整数值类型的例子,但是还有更多。
尝试使用一些基本类型,下面每个部分粘贴在 playground 的底部。
Floats 和 Doubles
let priceInferred = 19.99
let priceExplicit: Double = 19.99
有两种类型的小数点值,如:Float 和 Double。Double有更多的精确度, 并且默认是十进制值。这意味着 priceInferred 是 Double 类型。
Bools
let onSaleInferred = true
let onSaleExplicit: Bool = false
请注意,在 Swift 中使用 true/false 作为布尔值(在 Objective-C 中使用 YES/NO ,所以它们有点不同)。
Strings
let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"
字符串是如你所期望那样,但请注意,不再像在 Objective-C 中使用 @ 符号了。
if语句和字符串插值
if onSaleInferred {
println("/(nameInferred) on sale for /(priceInferred)!")
} else {
println("/(nameInferred) at regular price: /(priceInferred)!")
}
这是一个if语句的一个例子,就像在其它的编程语言一样。条件的括号是可选的,大括号是必需的,即使只有1行语句。
这里说明一个叫做字符串内插的新的技术的一个例子。在Swift中每当想要替换字符串中东西,只需使用此语法:/(表达式)。
在这一点上,可以看到在侧边栏中 println 的结果,由于空间有限它可能不好看到。要查看输出,将鼠标移动到该行,并单击出现的眼珠子(图标):
还有一个可以看到输出方法。去到Xcode的主菜单,然后选择 View/Assistant Editor/Show Assistant Editor.
助理编辑器会告诉你的代码中任何println语句的结果,并将结果值显示在一个方便的地方,这往往比使用鼠标放在每一行更容易。
类与方法
在Swift开发中会创建类和方法,这是最常见的作法,让我们来看看!
首先,删除在playground文件的一切内容,以便可以在一个干净的文件中开始新的代码编写。
接下来,将创建一个小费计算器类,以帮助描绘餐厅。 一次添加一小块代码,在这里将一步一步地解释。
// 1
class TipCalculator {
}
要创建一个类,只需在class关键字后输入类的名称。然后,类的主体使用一个大括号。
如果是继承另一个类,使用一个 :符号,后面是继承的类的名称。请注意,不一定需要继承(不像在Objective-C,在那里必须继承NSObject 之类的东西或派生自NSObject)。
添加以下代码在大括号内:
// 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)
}
这将为类创建一个初始化器并使用两个参数。初始化器在 Swift 的名称总是为 init – 但可以有多个(如果必要的话),可采用不同的参数。
请注意,这里已经给这个方法使用了参数,与这个类的属性的名称相同。正因为如此,需要通过将自身前缀在属性之前,以区分两者
请注意,由于没有 subtotal 属性,所以不会有名称冲突,不需要添加 self 关键字, 因为编译器可以自动推断。
注意: 如果想知道 subtotal = total / (tipPct + 1) 计算来自:
(subtotal * taxPct) + subtotal = total
subtotal * (taxPct + 1) = total
subtotal = total / (taxPct + 1)
在先前代码块后添加代码(花括号内):
// 4
func calcTipWithTipPct(tipPct: Double) -> Double {
return subtotal * tipPct
}
要定义一个方法, 可以使用 func 关键字. 然后列出参数(必须明确类型), 添加 -> 符号, 最后列出了返回类型。
这是一个函数,确定给小费的金额,这很简单,只要通过百分比乘以小计就可以得到结果。
在先前块之后添加代码(花括号内):
// 5
func printPossibleTips() {
println("15%: /(calcTipWithTipPct(0.15))")
println("18%: /(calcTipWithTipPct(0.18))")
println("20%: /(calcTipWithTipPct(0.20))")
}
这是新的方法用于打印出三个可能的小费。
需要注意的是,当调用一个类的实例方法,第一个参数不需要命名(但其余要)。
另外,还要注意字符串插值是如何不限于打印输出变量。可以使用各种复杂的方法调用和操作,但需要正确的内联!
添加以下代码到playground(大括号之后)的底部:
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()
最后,创建小费计算器的实例,并调用方法打印可能小费。
这是到目前为止整个 playground 文件的全部代码:
// 1
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()
查看助理编辑器的结果:
数组和For循环
目前,在上面的代码中有一些重复,因为调用 calcTipWithTotalmethod 几次来计算不同比例的小费。 这里可以通过使用一个数组来减少重复。
替换 printPossibleTips 如以下内容:
let possibleTipsInferred = [0.15, 0.18, 0.20]; // 小费比例数组列表
let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]; // 小费比例数组列表
这说明创建double类型数组,既有推断,又有显式类型的例子(同时创建只是用于演示目的)。需要注意的是[Double]是Array<Double>的快捷方式。
然后下面添加这些行:
for possibleTip in possibleTipsInferred {
println("/(possibleTip*100)%: /(calcTipWithTipPct(possibleTip))")
}
枚举遍历数组中的项与Objective-C相似,快速枚举- 请注意,不需要括号!
自己可编写类似这样的循环(但是目前这个语法是首选的风格):
for i in 0..< possibleTipsInferred.count {
let possibleTip = possibleTipsInferred[i]
println("/(possibleTip*100)%: /(calcTipWithTipPct(possibleTip))")
}
..< 运算符是一个非包函范围运算符,不包括上限值。还有一个运算符 ... 它具有包容性。
数组通过 count 属性来计算数组中的项目总数。也可以查找数组中特定项,通过语法 arrayName[index] 定义,如在这里看到。
字典
让我们做最后一次改变小费计算器。不是简单地打印出小费,可以将结果返回为字典。 这将使结果更容易显示在某种用于该应用的用户界面。
删除printPossibleTips方法,并将它替换为以下代码:
// 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 = [Int: Double]()
for possibleTip in possibleTipsInferred {
let intPct = Int(possibleTip*100)
// 3
retval[intPct] = calcTipWithTipPct(possibleTip)
}
return retval
}
这会得到一个错误在 playground 中,但很快就会解决了。
首先让我们通过以上部分的代码段:
在这里,标记方法返回字典,其中关键是int(尖端百分比为int,如15或20),并且该值是一个 Double(所计算的小费)。需要注意的是 [Int: Double] 只是 Dictionary<Int, Double> 的一个快捷方式。
这显示如何创建一个空的字典。请注意,因为正在此词典,需要声明它作为一个变量(使用var),而不是一个常量(使用let)。 否则,会得到一个编译错误。
这就是在字典中设置项目。 正如所看到的,它类似于Objective-C的字面量语法。
最后,修改 playground 文件的最后一行来调用这个方法(此修复错误):
tipCalc.returnPossibleTips()
当 playground 评估计算,应该能看到结果为字典(点击眼球的扩展视图,并使用下箭头展开)。
就是这样 - 恭喜,一个用Swift编写的全功能小费计算器已经完成!
下面是本教程所有最终 playground 文件的代码内容:
// 1
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
}
// 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 = [Int: Double]()
for possibleTip in possibleTipsInferred {
let intPct = Int(possibleTip*100)
// 3
retval[intPct] = calcTipWithTipPct(possibleTip)
}
return retval
}
}
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.returnPossibleTips()
}