最老程序员创业开发实训5---Swift语言极速入门

本来,我是特别反对拿着一本书,从头看到尾,认认真真地记住每个细节,以这种方式来学习一门编程语言的。相反,我特别崇尚写了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 闫涛
我的支付宝:[email protected]







你可能感兴趣的:(ios,mvc,swift,创业开发技术)