本教程将提供一些洞察,帮助对另一种语言有基本了解的开发人员熟悉 Swift。
Swift 是一种强大的表达性语言,最初针对 iOS 移动应用程序,后来衍生出了新的用途。您可以在此处阅读我的同事 Andrew Trice 写的文章,了解 Swift 的一些核心优势。
本教程还支持 Hour of Code 活动,该活动面向学生,用一小时时间介绍计算机科学基础知识。我们将在这里为 Swift 初学者撰写 #Hour Of Code 介绍性文章 。您将了解 Swift 概念,并通过在云中编写代码,使用IBM Swift Sandbox提高自己的学习水平。
我们将使用一个棒球方面的示例来说明这些概念。但是,如果您不是忠实粉丝,不必担心!要开始使用,请访问IBM Swift Sandbox。Sandbox 提供了在云中编写 Swift 代码的一种快速简便的方法。在 Source Code 面板中编写代码,单击 Run,您会立刻在 Output 面板看到您的结果!
有多个示例可供选择。首先,选择 hour_of_code.swift 示例。此示例为我们的练习提供了一个起点。还有一个 hour_of_code_solution.swift 文件提供了我们练习的答案;现在,尽力忍住不要偷看答案!
Player 类
我们要查看的第一个对象是 Player 类。向下滚动示例代码,找到 Player 的定义。
变量
首先,我们会专注于 Player 类和变量。我们将在后面讨论协议。如果只设置某个值一次,请使用 Let,而 var 则用于可能会变化(可变)的变量。另外,请注意,Swift 有类型推断,这意味着编译器可以从上下文推断变量类型,不需要明确定义它。您可以在下面的示例中看到 hits、atBats 和 walks 的定义。
最后,您会看到 nickName 属性后面有一个 ? 符号,这意味着它是一个可选变量,不必只有一个值。在本教程中,我们不会详细介绍可选变量。关于这一主题,只简单说一点,如果您有百分百的信心确定已经设置了该值,那么您可以使用 ! 运算符来检索可选变量的值,否则会产生一个运行时异常。例如,如果要输出 nickName,可以使用 print(nickName!)
// Player class that conforms to Hittable protocol public class Player:Hittable { //Immutable variables are defined with let. //They don't have to be initialized when defined. let name:String //An optional can hold a value or be nil let nickName:String? //Mutable variables are defined with var. var hits = 0 var atBats = 0
初始化程序
现在让我们来看看初始化程序。在这里,需要注意的是,Player 对象的初始化有两个参数,一个 name 和一个 String。Name 是必需的,nickName 是可选的,因此可以为其分配一个 nil 值。我们还通过添加 = nil 为 nickName 参数提供一个默认值,这样,在没有 nickName 的情况下,可以更简单地初始化 Player。另外,请注意 self 的用法;我们将设置 name 的类变量,使用 self.name 作为参数名。
//An initializer is defined with init.The nickName parameter //has a default value of nil if it is not passed in to the function. public init(name:String, nickName:String?= nil) { //Self is used to distinguish between the class property and //the property passed into the initializer self.name = name self.nickName = nickName }
计算属性
接下来,让我们来看一下计算属性。计算属性类似于某个变量被访问时自动执行的函数。我们已经定义了 battingAverage 属性,它计算每次打数(尝试击球)的安打率。由于 hits 和 atBats 被存储为整数,所以它们的计算结果使用了双精度,以便让结果更精确。另请注意,我们还使用了三元运算符,它遵循 x ? y : z 的格式,其中,x 是一个表达式,如果表达式为 true,则执行 y,如果表达式为 false,则执行 z。在本例中,如果球员还没有打数,我们使用这个运算符来避免被除数为 0 的错误。
//A computed property calculates rather than stores a value public var battingAverage:Double { return atBats > 0 ?Double(hits) / Double(atBats) :0 } public var rating:String { if battingAverage > 0.3 { return Rating.AllStar.rawValue } return Rating.BenchWarmer.rawValue }
函数
函数让类的用户可以在对象上执行功能。在本例中,我们已经定义了两个函数:hit() 和 out()。hit 函数增加了 hits 和 atBats 变量,而 out 函数只增加了 atBats 变量。每个函数都有一个 public 访问等级,这意味着可以从任何模块调用函数。还有 internal 和 private 访问等级,我们不打算在这里深入介绍。这些函数都不会返回值(在某些语言中,会返回 void)。如果某个函数返回了一个值,它的声明会附加一个 ->,也就是说,public func hit() -> Bool 表明,hit() 返回了一个 true 或 false 值。
public func hit() { hits++ atBats++ } public func out() { atBats++ }
使用类
接下来,我们将演示如何创建和使用类。请查看下面的代码,它实例化一个球员,然后在其上调用了若干个函数。球员有一个安打后,他们的评分就会增加。
//Instantiate a player named Swifty let p = Player(name:"Swifty") //Call the out function on the player p.out() print(p.rating) p.out() p.hit() //The player's rating has improved! print(p.rating)
练习
协议
协议是类必须遵循的方法和属性的准则。协议中定义了一些要求,协议可以帮助类遵循一致的模式来实现这些要求。在我们的示例中,我们定义了 2 个函数:hit() 和 out(),还定义了 battingAverage 属性,必须在采用 Hittable 协议的任何类中定义它们。现在,请注意 Player 类的定义如何引用 Hittable 协议。
//Define variables and functions that classes must conform to public protocol Hittable { func hit() func out() //A variable of type Double with only a getter var battingAverage:Double { get } }
练习
枚举允许您定义一组相关的值。在本例中,我们将 Rating 定义为有 2 个值的枚举参数,AllStar 和 BenchWarmer。球员需要 .300 或更高的安打率才会被视为 AllStar。我们还提供了原始值,以便采用更加适合人类阅读的方式来打印枚举值。
//An enum lists defines discrete values.A raw value can also be provided //for each value, in this case a String. public enum Rating:String { case AllStar = "All Star" case BenchWarmer = "Bench Warmer" }
练习
结束语
在本 Swift 教程中,您使用了一些通用的语言概念,比如类、协议、函数和枚举。您还学习了一些更高级的概念,比如,计算属性和可选属性。IBM Swift Sandbox 可以让您轻松地了解 Swift 并在云中测试代码。我们希望您喜欢本教程,并再次回到这里,从IBM Swift 工程了解有关的更多信息。
原文请访问 IBM developerWorks / Developer CentersSwift@IBM。
Swift 和 Swift 标志属于 Apple Inc。