A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 余永健 中级黑马   /  2015-2-8 14:17  /  790 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

《The Swift Programming Language 中文版》学习主题
http://www.azolla.io/topics/?id=54


1.
Swift给出的第一件重大的事情是类型推断。使用类型推断的语言,程序员不需要使用类型信息给变量作注释。编译器可以从给变量赋的值推断出该变量的类型。例如,编译器可以自动把下面这个值设置为String类型:

// automatically inferred
var name1 = "Matt"
// explicit typing (optional in this case)
var name2:String = "Matt"

连同类型推断一起,Swift还给出了类型安全。


2.
关于Swift中集合的一件比较有趣的事是它们的可变性。没有与Array和Dictionary对应的“可变的”类型。取而代之地是,使用标准的let和var。对于那些还没有阅读这本书,或者根本没有探索Swift的人们(我建议你去做,尽快!),let用于声明一个常量,var用于声明一个变量,是的,变量!let类似于在C/C++/Objective-C中使用const。如果集合用let来声明就表示它的长度是不可变的。也就是说,不能再向其中添加,或者从其中移除。如果你试一下,你会得到下面的错误:

let array = [1, 2, 3]
array.append(4)
// error: immutable value of type 'Array<Int>' only has mutating members named 'append'
这同样适用于字典。基于此,编译器能推断出集合是否为可变的,然后做适当的优化。例如,如果大小不能改变,那么存储值的存储器不必再分配空间给新值。因此对于不会改变的集合总是使用let修饰是一个好习惯。


3.
闭包
请参考Swift中文网的 Swift闭包详解


4.
Swift另一个重大的特性是泛型。如果你熟悉C++,你会想起像模板这样的东西。因为Swift是明确类型的,所以你必须在声明一个函数时传递确定的类型。但是有时一些功能对于多个不同的类型是一样的。这种情况的例子就是是经常用到的一对数值构成的一个结构体类型。在Swift中对于整数可以像下面这么实现:

struct IntPair {
    let a: Int!
    let b: Int!

    init(a: Int, b: Int) {
        self.a = a
        self.b = b
    }

    func equal() -> Bool {
        return a == b
    }
}

let intPair = IntPair(a: 5, b: 10)
intPair.a // 5
intPair.b // 10
intPair.equal() // false
稍微有用。但是现在你想让这个类对于浮点数也适用。你可以定义FloatPair类,但是它会和上面的类非常相似。因此泛型出现了。无需再声明一个全新的类,你只要简单的像下面这样做即可:

struct Pair<T: Equatable> {
    let a: T!
    let b: T!

    init(a: T, b: T) {
        self.a = a
        self.b = b
    }

    func equal() -> Bool {
        return a == b
    }
}

let pair = Pair(a: 5, b: 10)
pair.a // 5
pair.b // 10
pair.equal() // false

let floatPair = Pair(a: 3.14159, b: 2.0)
floatPair.a // 3.14159
floatPair.b // 2.0
floatPair.equal() // false
相当的有用!为什么你这次会想到这个特性似乎并不清楚,但是相信我:机会是无穷无尽的。你会很快开始明白在自己的代码里何处会用到这些。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马