summaryrefslogtreecommitdiffhomepage
path: root/zh-cn/swift-cn.html.markdown
blob: b9696c72e667abcaabe8e8497d977dc123265926 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
---
language: swift
filename: learnswift-cn.swift
contributors:
  - ["Grant Timmerman", "http://github.com/grant"]
translators:
  - ["Xavier Yao", "http://github.com/xavieryao"]
lang: zh-cn
---

Swift 是Apple 开发的用于iOS 和OS X 开发的编程语言。Swift 于2014年Apple WWDC (全球开发者大会)中被引入,用以与Objective-C 共存,同时对错误代码更具弹性。Swift 由Xcode 6 beta 中包含的LLVM编译器编译。

参阅:Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html) ——一个完整的Swift 教程

```swift
//
// 基础
//

println("Hello, world")
var myVariable = 42
let myConstant = 3.1415926
let explicitDouble: Double = 70
let label = "some text " + String(myVariable)     // Casting
let piText = "Pi = \(myConstant)"                 // String interpolation
var optionalString: String? = "optional"          // Can be nil
optionalString = nil


//
// 数组与字典(关联数组)
//

// 数组
var shoppingList = ["catfish", "water", "lemons"]
shoppingList[1] = "bottle of water"
let emptyArray = String[]()

// 字典
var occupations = [
  "Malcolm": "Captain",
  "kaylee": "Mechanic"
]
occupations["Jayne"] = "Public Relations"
let emptyDictionary = Dictionary<String, Float>()


//
// 控制流
//

// 用于数组的for 循环
let myArray = [1, 1, 2, 3, 5]
for value in myArray {
  if value == 1 {
    println("One!")
  } else {
    println("Not one!")
  }
}

// 用于字典的for 循环
for (key, value) in dict {
  println("\(key): \(value)")
}

// 用于区间的for 循环
for i in -1...1 { // [-1, 0, 1]
  println(i)
}
// 使用 .. 表示的区间不包含最后一个元素 [-1,0,1)

// while 循环
var i = 1
while i < 1000 {
  i *= 2
}

// do-while 循环
do {
  println("hello")
} while 1 == 2

// Switch
let vegetable = "red pepper"
switch vegetable {
case "celery":
  let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
  let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
  let vegetableComment = "Is it a spicy \(x)?"
default: // 必须 (为了覆盖所有可能的输入)
  let vegetableComment = "Everything tastes good in soup."
}


//
// 函数
//

// 函数是一等类型,这意味着可以在函数中构建函数
// 并且可以被传递

// 函数
func greet(name: String, day: String) -> String {
  return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

// 使用多元数组返回多返回值的函数
func getGasPrices() -> (Double, Double, Double) {
  return (3.59, 3.69, 3.79)
}

// 不定参数
func setup(numbers: Int...) {}

// 传递、返回函数
func makeIncrementer() -> (Int -> Int) {
  func addOne(number: Int) -> Int {
    return 1 + number
  }
  return addOne
}
var increment = makeIncrementer()
increment(7)


//
// 闭包
//

// 函数是特殊的闭包({})

// 闭包示例.
// `->` 分隔参数和返回类型
// `in` 分隔闭包头和闭包体
numbers.map({
  (number: Int) -> Int in
  let result = 3 * number
  return result
  })

// 当类型已知时,可以这样做:
var numbers = [1, 2, 6]
numbers = numbers.map({ number in 3 * number })
print(numbers) // [3, 6, 18]


//
// 类
//

// 类的全部方法和属性都是public 的
// 如果你在一个数据结构中只需储存数据,
// 应使用 `struct`

// 集成自`Shape` 类的简单的类`Square
class Rect: Shape {
  var sideLength: Int = 1

  // Custom getter and setter property
  var perimeter: Int {
    get {
      return 4 * sideLength
    }
    set {
      sideLength = newValue / 4
    }
  }

  init(sideLength: Int) {
    super.init()
    self.sideLength = sideLength
  }

  func shrink() {
    if sideLength > 0 {
      --sideLength
    }
  }

  override func getArea() -> Int {
    return sideLength * sideLength
  }
}
var mySquare = new Square(sideLength: 5)
print(mySquare.getArea()) // 25
mySquare.shrink()
print(mySquare.sideLength) // 4

// 如果你不需要自定义getter 和setter,
// 但仍希望在获取或设置一个属性之前或之后运行
// 一些代码,你可以使用`willSet` 和 `didSet`


//
// 枚举类型
//

// 枚举类型可以是某种指定的类型,抑或自成一种类型
// 像类一样,枚举类型可以包含方法

enum Suit {
  case Spades, Hearts, Diamonds, Clubs
  func getIcon() -> String {
    switch self {
    case .Spades: return "♤"
    case .Hearts: return "♡"
    case .Diamonds: return "♢"
    case .Clubs: return "♧"
    }
  }
}


//
// 其它
//

// `协议(protocol)`: 与Java 的接口(Interface) 类似.
// `扩展(extension)`: 为现有类型添加额外特性
// 泛型: 与Java 相似。使用`where` 关键字指定
//   泛型的要求.

```