最老程序员创业开发实训5

本来,我是特别反对拿着一本书,从头看到尾,认认真真地记住每个细节,以这种方式来学习一门编程语言的。相反,我特别崇尚写了Hello World之后,直接进入编程练习,在编程中学习各种语言细节,当你基本能够熟练地编写程序时,在回过头来,去抠各种语言相关的特性和细节,这种学习方式的效率最高,也更有可能坚持下来。

但是由于Swift语言很新,又有很多新特性,,虽然有翻译过来的语言手册,但是估计绝大多数人还是没有接触过这门语言,因此本节粗略介绍一下Swift语言。需要注意的是,本节只是对Swift语主要特性Hello World级介绍,为的只是能在后续章节中Swift语法对大家来说不太陌生,其他语言细节,会在相关章节中详细介绍。在阅读完本系列后,建议在看苹果的the-swift-programming-language文档,并且最好是看英文原版的,翻译过来的会差一些,想做程序员,要培养直接读英文文档的能力。

在Swift中区分变量和常量,当值不改变时,设计为常量可以提高程序效率,并且提高代码安全性(防止误改)。另外,虽然Swift是强类型语言,Swift在多数情况下可以自己判断常量或变量类型,因此多数情况下只要设置初始值,无需指定类型。如下所示:

var myStr = "Hello World" // 声明字符型变量let pi = 3.1415926 // 声明常量Swift不要求每个语句后面写;号,所以上面语句是合法的。

Swift中大量使用数组,数组有关语法:

var allNames1 = ["John", "Tom"] // 声明字符数组var allNames2 = String[]() // 声明空字符数组let scores = Double[](count: 50, repeatedValue: 0.0) // 声明具有50个元素的数组,初始值为0.0allNames1.append("Marry") // 向数组最后添加元素allNames1.insert("Kerry", atIndex: 1) // 在指定位置插入元素let lastElement = allNames1.removeLast() // 移除并返回最后一个元素let element = allNames1.removeAtIndex(1) // 移除并返回指定位置元素let count = allNames1.count // 求出数组元素数if allNames1.isEmpty {… } // 判断数组是否为空for name in allNames { … } // 循环数组中所有元素在Swift中另一个常用的类就是Dictionary,其常用操作如下所示:var airportNames = ["TYO": "Tokyo", "DUB": "Dublin"] // 声明字典var airportNames1 = Dictionary<String, String>() // 声明空字典airportNames["PEK"] = "Beijing" // 如果没有添加新条目,如果有则更新let oldValue = airportNames.updateValue("ShouDu", "PEK") // 如果没有添加条目并返回nil,如果有更新条目并返回原来条目的值airportNames["PEK"] = nil // 删除条目let oldValue1 = airportNames.removeValueForKey("PEK") // 移除并返回指定Key的条目let numbers = airportNames.countfor (airportCode, airportName) in airportNames {… } // 遍历字典,同时获取Key和Valuesfor airportCode in airportNames.keys {… } // 遍历字典键值for airportName in airportNames.values {… } // 遍历字典值let codes = Array(airportNames.keys) // 将所有键值转为数组let names = Array(airportNames.values) // 将所有值转为数组函数定义: 由关键字,函数名,参数列表和以->区分开的返回值类型,与其他语言不同,Swift函数中参数有内部名和外部名,其中外部名在调用时采用,内部名在函数内部使用,是由Objective-C引入的,据说可以增加代码的可读性。

func createData(externalName1 internalName1: Int, externalName2, internalName2: String) -> Double

下面介绍一下Swift中最重要的类:

class Person {var firstName: String?var lastName: String?var middleName: String?init(firstName: String, lastName: String, midlleName: String) {self.firstName = firstNameself.lastName = lastNameself.middleNaem = middleName}func getFullName() -> String {var middle = ""if let middle = middleName {return firstName! + middle + lastName!} else {return firstName! + lastName!}}}在上面的代码中,定义的Person类,其中使用了三个Optional String的属性,定义了初始化函数init,定义了getFullName方法,在此处假定,firstName和lastName绝对不为空,而middleName可能为空,返回该Person的全名。其中需要说明的一点就是Swift引入的Optional类型,可以帮助我们更好的处理空指针异常,这个特性在Java 8中也有,都是为了避免常见编码错误而引入的新特性。

定义好类之后,可以按照如下方式调用:

var p1 = Person(firstName: "Jodge", lastName: "Bill", middleName: "W")let fullName = p1.getFullName()在Swift中引入一种新的循环类型,如:for index in 1…10 { … } // 从1开始直到10循环for index1 in 1..10 {… } // 从1开始到10循环(但不包括10)在Swift中还有为了避免常见的编程错误,其等号是不返回值的:var a =1if a = 2 {… } // 会报错,因为该表达式无值另外,Swift语名除了可以用任何值作为case条件外,每个case下必须包括一条语句,而且只会执行到下一个case之前,所以case下不用写break,但是如果case没有处理所有情况时,必须添加default语句

Swift中引入枚举类型也是一个非常灵活的元素,有两种基本的用法:

使用关联值:

enum Barcode{case UPCA(Int, Int, Int)case QRCode(String)}var p1 = Barcode.UPCA(10, 12345_67890, 2)var p2 = Barcode.QRCode("ABCDEDEWTETG")func printBarcode(#product: Barcode) {switch product {case .UPCA(let system, let identifier, let check):println("UPC-A:\(system),\(identifier),\(check)")case .QRCode(let qrcode):println("QRCode:\(qrcode)")}}printBarcode(product: p1) // 打印UPC-A: 10, 12345_67890, 2printBarcode(product: p2) // 打印QRCode: ABCDEDEWTETG另外一种方式是使用原始值:enum {case Estate = "Estate"case Hatchback = "Hatchback"case Saloon = "Saloon"}class Car {let classification: CarClassificationlet year: Intinit(classification: CarClassification, year: Int) {self.classification = classificationself.year = year}|func classifyCar(#car: Car) {switch car.classification {case .Estate where car.year > 2013:println("new Estate car")case .Hatchback where car.year > 2015:println("new Hatchback car")default:println("I don’t know")}}var car1 = Car(classification: .Estate, year: 2015)classifyCar(car: car1) // 打印new Estate carvar car2 = Car(classification: .Estate, year: 2005)classifyCar(car: car2) // 打印I don’t know好了,以上就是Swift语言基础的部分,还有一些语言细节,我们将在后续章节中逐一进行介绍。在下一节中,我将在Swift下实现Splash屏幕功能,大家可以和Android实现进行比较,加深对IOS和Android平台开发异同点的理解。

终究还是会从指缝中一滴一滴流淌干净。

最老程序员创业开发实训5

相关文章:

你感兴趣的文章:

标签云: