本来,我是特别反对拿着一本书,从头看到尾,认认真真地记住每个细节,以这种方式来学习一门编程语言的。相反,我特别崇尚写了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.0
allNames1.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.count
for (airportCode, airportName) in airportNames {... } // 遍历字典,同时获取Key和Values
for 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 = firstName
self.lastName = lastName
self.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 =1
if 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, 2
printBarcode(product: p2) // 打印QRCode: ABCDEDEWTETG
另外一种方式是使用原始值:
enum {
case Estate = "Estate"
case Hatchback = "Hatchback"
case Saloon = "Saloon"
}
class Car {
let classification: CarClassification
let year: Int
init(classification: CarClassification, year: Int) {
self.classification = classification
self.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 car
var car2 = Car(classification: .Estate, year: 2005)
classifyCar(car: car2) // 打印I don't know
好了,以上就是Swift语言基础的部分,还有一些语言细节,我们将在后续章节中逐一进行介绍。在下一节中,我将在Swift下实现Splash屏幕功能,大家可以和Android实现进行比较,加深对IOS和Android平台开发异同点的理解。
华丽的分隔线
******************************************************************************************************************************************************************************
希望大家多支持,有大家的支持,我才能走得更远,谢谢!
银行账号:622202 0200 1078 56128 闫涛
我的支付宝:yt7589@hotmail.com