C 开发者对 Swift 亮点的点评(3)

你已经知道并爱上了NSArray,NSDictionary和与它们对应的类。那么,你现在将了解Swift中与其相对应的类。幸运地是,他们非常相似。下面是如何定义数组和字典:

let array = [1, 2, 3, 4]
let dictionary = ["dog": 1, "elephant": 2]

这对于你来说应该相当熟悉了。然而还是有一点不同。在Objective-C中,数组和字典可以包含任意你想要的类型。但是在Swift中,数组和字典是类型化的。并且是通过使用我们上面的朋友—泛型来类型化的!

上面两个变量可以使用明确的类型重写(不过请记住你实际上不需要这么做),如下:

let array: Array<Int> = [1, 2, 3, 4]
let dictionary: Dictionary<String, Int> = ["dog": 1, "elephant": 2]

请注意是如何用泛型来定义存储在容器中的东西的。对于数组来说还有一种简短的形式来表示,这种形式的可阅读性更强一些,但是本质上还是一样的东西:

let array: Int[] = [1, 2, 3, 4]

现在请注意你不能向该数组里添加非Int类型的东西。这听起来是一件糟糕的事情,但是它却极其有用。你的API再也不用写文档来说明,一个方法返回的数组或者一个数组属性存储的是什么东西了。你可以给编译器提供明确的信息,以便它能更智能进行错误检查和之前提到的优化。

可变性

关于Swift中集合的一件比较有趣的事是它们的可变性。没有与Array和Dictionary对应的“可变的”类型。取而代之地是,使用标准的let和var。对于那些还没有阅读这本书,或者根本没有探索Swift的人们(我建议你去做,ASAP!),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修饰是一个好习惯。

字符串

Objective-C中的字符串众所周知处理起来很让人烦躁,即使像拼接多个不同值这样简单的事情都很枯燥乏味。例如下面: 

Person *person = ...;

NSMutableString *description = [[NSMutableString alloc] init];
[description appendFormat:@"%@ is %i years old.", person.name, person.age];
if (person.employer) {
  [description appendFormat:@" They work for %@.", person.employer];
} else {
  [description appendString:@" They are unemployed."];
}

这相当的枯燥乏味,并且包含了许多与数据处理无关的字符。同样的事情在Swift中像下面这样处理: 

var description = ""
description += "\(person.name) is \(person.age) years old."
if person.employer {
    description += " They work for \(person.employer)."
} else {
    description += " They are unemployed."
}

更加整洁!请注意这种用一个格式创建一个字符串更加整洁的方式,现在你可以使用+=创建字符串。不再需要可变的和不可变的字符串。

Swift的另一个非常棒的扩展是字符串比较。你很清楚在Objective-C中使用==来比较字符串是不正确的。取而代之地,你应该使用isEqualToString:方法。因为前者是指针比较。Swift移除了这个间接的标准,相反地让你能够直接使用==比较字符串。这也意味着字符串可以用于switch语句。下面一段内容会更加详细的介绍。

最后一个好消息是Swift支持全部Unicode字符集。你可以在字符串中使用任何Unicode码位,甚至是函数和变量的名字!如果你想要,现在你可以定义一个叫Linux公社的变量。 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/97c0734d66e501553a4fb740d6d48d05.html