调用方法 Swift中,函数的参数名称只能在函数内部使用,但方法的参数名称除了在内部使用外还可以在外部使用(第一个参数除外),例如: - class Counter {
- var count: Int = 0
- func incrementBy(amount: Int, numberOfTimes times: Int) {
- count += amount * times
- }
- }
- var counter = Counter()
- counter.incrementBy(2, numberOfTimes: 7)
注意Swift支持为方法参数取别名:在上面的代码里,numberOfTimes面向外部,times面向内部。 ?的另一种用途 使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如: - let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional
- square")
- let sideLength = optionalSquare?.sideLength
当optionalSquare为nil时,sideLength属性调用会被忽略。 枚举和结构 枚举 使用enum创建枚举——注意Swift的枚举可以关联方法: - enum Rank: Int {
- case Ace = 1
- case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
- case Jack, Queen, King
- func simpleDescription() -> String {
- switch self {
- case .Ace:
- return "ace"
- case .Jack:
- return "jack"
- case .Queen:
- return "queen"
- case .King:
- return "king"
- default:
- return String(self.toRaw())
- }
- }
- }
- let ace = Rank.Ace
- let aceRawValue = ace.toRaw()
使用toRaw和fromRaw在原始(raw)数值和枚举值之间进行转换: - if let convertedRank = Rank.fromRaw(3) {
- let threeDescription = convertedRank.simpleDescription()
- }
注意枚举中的成员值(member value)是实际的值(actual value),和原始值(raw value)没有必然关联。 一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值: - enum Suit {
- case Spades, Hearts, Diamonds, Clubs
- func simpleDescription() -> String {
- switch self {
- case .Spades:
- return "spades"
- case .Hearts:
- return "hearts"
- case .Diamonds:
- return "diamonds"
- case .Clubs:
- return "clubs"
- }
- }
- }
- let hearts = Suit.Hearts
- let heartsDescription = hearts.simpleDescription()
除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值: - enum ServerResponse {
- case Result(String, String)
- case Error(String)
- }
- let success = ServerResponse.Result("6:00 am", "8:09 pm")
- let failure = ServerResponse.Error("Out of cheese.")
- switch success {
- case let .Result(sunrise, sunset):
- let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
- case let .Error(error):
- let serverResponse = "Failure... \(error)"
- }
结构 Swift使用struct关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passed by value),而类的实例按引用传递(passed by reference)。 - struct Card {
- var rank: Rank
- var suit: Suit
- func simpleDescription() -> String {
- return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
- }
- }
- let threeOfSpades = Card(rank: .Three, suit: .Spades)
- let threeOfSpadesDescription = threeOfSpades.simpleDescription()
协议(protocol)和扩展(extension) 协议 Swift使用protocol定义协议: - protocol ExampleProtocol {
- var simpleDescription: String { get }
- mutating func adjust()
- }
类型、枚举和结构都可以实现(adopt)协议: - class SimpleClass: ExampleProtocol {
- var simpleDescription: String = "A very simple class."
- var anotherProperty: Int = 69105
- func adjust() {
- simpleDescription += " Now 100% adjusted."
- }
- }
- var a = SimpleClass()
- a.adjust()
- let aDescription = a.simpleDescription
- struct SimpleStructure: ExampleProtocol {
- var simpleDescription: String = "A simple structure"
- mutating func adjust() {
- simpleDescription += " (adjusted)"
- }
- }
- var b = SimpleStructure()
- b.adjust()
- let bDescription = b.simpleDescription
扩展 扩展用于在已有的类型上增加新的功能(比如新的方法或属性),Swift使用extension声明扩展: - extension Int: ExampleProtocol {
- var simpleDescription: String {
- return "The number \(self)"
- }
- mutating func adjust() {
- self += 42
- }
- }
- 7.simpleDescription
泛型(generics) Swift使用<>来声明泛型函数或泛型类型: - func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
- var result = ItemType[]()
- for i in 0..times {
- result += item
- }
- return result
- }
- repeat("knock", 4)
Swift也支持在类、枚举和结构中使用泛型: - // Reimplement the Swift standard library's optional type
- enum OptionalValue<T> {
- case None
- case Some(T)
- }
- var possibleInteger: OptionalValue<Int> = .None
- possibleInteger = .Some(100)
有时需要对泛型做一些需求(requirements),比如需求某个泛型类型实现某个接口或继承自某个特定类型、两个泛型类型属于同一个类型等等,Swift通过where描述这些需求: - func anyCommonElements <T, U where T: Sequence,
- U: Sequence, T.GeneratorType.Element: Equatable,
- T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
- for lhsItem in lhs {
- for rhsItem in rhs {
- if lhsItem == rhsItem {
- return true
- }
- }
- }
- return false
- }
- anyCommonElements([1, 2, 3], [3])
Swift语言概览就到这里,有兴趣的朋友请进一步阅读The Swift Programming Language。 接下来聊聊个人对Swift的一些感受。 个人感受 注意:下面的感受纯属个人意见,仅供参考。 大杂烩 尽管我接触Swift不足两小时,但很容易看出Swift吸收了大量其它编程语言中的元素,这些元素包括但不限于: 属性(Property)、可空值(Nullable type)语法和泛型(Generic Type)语法源自C#。 格式风格与Go相仿(没有句末的分号,判断条件不需要括号)。 Python风格的当前实例引用语法(使用self)和列表字典声明语法。 Haskell风格的区间声明语法(比如1..3,1...3)。 协议和扩展源自Objective-C(自家产品随便用)。 枚举类型很像Java(可以拥有成员或方法)。 class和struct的概念和C#极其相似。 注意这里不是说Swift是抄袭——实际上编程语言能玩的花样基本就这些,况且Swift选的都是在我看来相当不错的特性。 而且,这个大杂烩有一个好处——就是任何其它编程语言的开发者都不会觉得Swift很陌生——这一点很重要。 拒绝隐式(Refuse implicity) Swift去除了一些隐式操作,比如隐式类型转换和隐式方法重载这两个坑,干的漂亮。 Swift的应用方向 我认为Swift主要有下面这两个应用方向: 教育 我指的是编程教育。现有编程语言最大的问题就是交互性奇差,从而导致学习曲线陡峭。相信Swift及其交互性极强的编程环境能够打破这个局面,让更多的人——尤其是青少年,学会编程。 这里有必要再次提到Brec Victor的Inventing on Principle,看了这个视频你就会明白一个交互性强的编程环境能够带来什么。 应用开发 现有的iOS和OS X应用开发均使用Objective-C,而Objective-C是一门及其繁琐(verbose)且学习曲线比较陡峭的语言,如果Swift能够提供一个同现有Obj-C框架的简易互操作接口,我相信会有大量的程序员转投Swift;与此同时,Swift简易的语法也会带来相当数量的其它平台开发者。 总之,上一次某家大公司大张旗鼓的推出一门编程语言及其编程平台还是在2000年(微软推出C#),将近15年之后,苹果推出Swift——作为开发者,我很高兴能够见证一门编程语言的诞生。
|