零基础上手Swift快速入门教程概览

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() }