源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

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

扫一扫进微信版
返回顶部