1 // Playground - noun: a place where people can play
2
3 import UIKit
4
5 var str = "Hello, World!"
6
7 //1 定义变量常量/常量
8 // define const
9
10 //1.1 定义变量 使用var定义
11 var huangxiangwang = "huangxiangwang"
12 var huangxiangwang2hao = "huangxiangwang2hao"
13
14 println(huangxiangwang)
15
16 //1.2 定义常量 使用let定义
17 let qm = "qiaoming"
18 //qm = "da" //错误
19
20 //1.3 变量常量的命名规范:几乎支持所有的Unicode编码字符,除了一些数字符号,箭头,横线,以及系统的关键字
21 var 😄 = "😄"
22 println(😄)
23
24 var 哈哈 = "哈哈"
25 println(哈哈)
26
27 //错误示范
28 //var var = "afs"
29 //var -aa = "aad"
30
31
32
33 //2.基本类型
34 //2.1
35 //C/C++语言类型: 整型(int), 单精度浮点型(float), 双精度浮点型(double), 布尔型(bool), 字符型(char)
36 //在Swift语言中,基本类型几乎已经被重写了.首字母大写
37 //Swift基本变量类型: Int Float Double Bool String
38
39 //2.2
40 var zs = 213
41 zs
42 let whq = "234"
43 whq
44 //[注]在Swift语言中,声明变量常量如果没有类型而是直接赋值的话,编译器会自动推断出常量变量的类型
45
46 //2.3 命名常量/变量
47 //变量/常量 : 类型 = 值
48 var lmt : String = "刘敏涛"
49 //var lgz : Int = "213" //错误
50
51 //2.4 练习
52 var zwd : Int = 23333
53 //在swift中,整型是Int,系统默认64位,如果系统为32位,则默认32位
54
55
56 var wzb : Int8 = -128
57 //Int8范围: -128 ~ +127
58
59
60
61 //[Practice]变量/常量
62
63 var abcd = "abcd"
64 let qwer = "QWER"
65 let num = 1234
66
67
68 var rkf = 3.5
69 //在Swift中浮点类型默认为double
70 var rly : Float = 2.6
71 var cj = 3.6
72
73 let dfr = rly + Float(cj)
74 //[NOTE]在Swift语言中不支持隐式转化,可以进行显示转化
75 //转化的方式: 类型(变量/常量)
76
77
78 //3.元祖
79 //元祖 就好比数据库中得表,数据库中得一条记录就系那个当与一个元祖.在这个元组中,里面可以存放不同的数据类型的数据
80 var ntt : (String, Int, String) = ("牛田田", 22, "女")
81 ntt.0
82 ntt.1
83 ntt.2
84
85 //通过下标访问元祖中的元素
86
87 var wxx : (name: String, age: Int, Sex: String) = ("王玺玺", 23, "男")
88 //在定义一个元祖的时候可以给元祖的数据一个名字,之后我们通过这个名字访问元祖中的元素
89 wxx.name
90 wxx.age
91 wxx.Sex
92 wxx.0
93 wxx.1
94 wxx.2
95
96
97 //我们可以将元祖的元素分解
98 let gcz = ("龚朝忠", 25)
99 var (name, age) = gcz
100 name
101 age
102
103 //元素分解,遇到不想遇到的参数,可以通过 _ 忽略
104 let shb = ("沈红榜", 23, "男")
105 let (name1, _, sex1) = shb
106 name1
107 sex1
108
109
110 //4.数组
111 //[NOTE]在OC中,数组存放的元素都是基于NSObject类型的对象,企鹅对象类型可以不相同.而在Swift中,数组必须存放系那个同类型的对象
112
113 //定义一个数组
114 var lc : Array = [String]()
115 lc
116 let sxr : Array = [String]()
117
118 //var声明数组为可变数组
119 //let声明数组为不可变数组
120
121 var gst = ["郭松涛", "张国栋", "邵文乐"]
122 //编译器会对类型就行类型推断,gst首先是一个Array数组,其次,里边的数据是String的,所以推断出是字符串数组
123
124 //var ww = ["王伟", 24] NSObject
125
126 //增
127 gst.append("豆培")
128 gst.insert("徐军辉", atIndex: 1)
129
130 //删
131 gst.removeLast()
132 gst.removeAtIndex(1)
133 gst
134
135 //改
136 gst[0] = "马锐"
137
138 //查
139 //1.根据下标访问
140 gst[1]
141 //2.根据下标范围访问
142 //...表示一个闭区间
143 gst[0...2]
144 //..<表示一个开区间
145 gst[0..<2]
146
147 //3.遍历
148 for name in gst {
149 name
150 }
151
152 //4.获取数组中得元素以及位置
153 for (index, name) in enumerate(gst) {
154 index
155 name
156 }
157
158 //5.字典
159 //[NOTE]在Swift中依旧保留了key-value,但是需要注意的地方:value也必须是同一种类型
160
161 //声明一个变量
162 var sc = Dictionary<String, Int>()
163
164 //增
165 //Swift中,通过下标访问字典中的元素,如果字典中没有相对应的key,那么就是添加数据
166 sc["age"] = 2
167 sc["name"] = 4
168 sc
169
170 //删
171 sc.removeValueForKey("age")
172 sc
173
174 //改
175 //通过下标访问字典中的元素,如果字典中有对应的key,那么就修改对应的值
176 sc["name"] = 100
177 sc
178
179 //查
180 //1.下标法
181 //2.遍历 for-in
182 for (key, value) in sc {
183 key
184 value
185 }
186
187 for key in sc.keys {
188 key
189 }
190
191 sc.keys
192 sc.values
193
194 var flag = true
195 flag
196 flag = false
197 //flag = 10 错误
198
199 //String
200 var b_hxw : String = "Xiangwang Huang"
201 b_hxw.uppercaseString //大写
202 b_hxw.lowercaseString //小写
203
204
205 //***************************************************************
206 //分支结构
207 //1.if-else
208
209 //错误
210 //if 条件 {
211 // 语句块
212 //}
213 //
214 //[NOTE]条件必须是bool类型
215
216 var a = 6
217 if a == 5 {
218 a
219 } else {
220 println("a != 5")
221 }
222
223 //2. switch-case
224 var b = 2
225 switch b {
226 case 0:
227 b + 0;
228 case 1:
229 b + 1;
230 case 2:
231 b + 2;
232 case 3:
233 b + 3;
234 fallthrough //[note]在swift中,通过使用fallthrough可以强制的执行下一个case
235 case 4:
236 b + 4;
237 default:
238 b + 3;
239 }
240 //[NOTE]写switch一定要加上default
241 //[NOTE]在swift中,switch case加强后,无需在每个case后添加break
242
243 //[练习]给一个日期,xx年xx月xx日,计算这一天是这个年的第几天
244
245 //switch中得case可以表示为一个范围,范围可以交叉,执行满足第一个条件后跳出去
246 var c = 300
247 switch c {
248 case 0...300 where c != 300: //使用where进行双重判断
249 println("在0-300之间")
250 case 200...400:
251 println("在300-600之间")
252 case 400...600:
253 println("在600-900之间")
254 default:
255 println("没有这个数")
256 }
257
258
259 //元祖也可以作为switch条件
260 var point = (1, 0)
261 switch point {
262 case (0, 0):
263 println("原点")
264 case (_, 0):
265 println("在X轴上")
266 case (0, _):
267 println("在Y轴上")
268 default:
269 println("其他点")
270 }
271
272
273 //3.循环结构
274 //3.1for
275 for var i = 0; i < 10; i++ {
276 i
277 }
278
279 //3.2 for-in
280 for j in 0..<10 {
281 j
282 }
283
284 //3.3 while
285 var sum = 0
286 //while的条件也需要哦返回值为Bool类型条件 例如:while 1 {}为错误案例
287 while sum < 7 {
288 sum += 1
289 }
290
291 do {
292 sum++
293 } while sum < 10
294
295
296 //======================================================================
297 //______________________________________________________________________
298 //----------------------------------------------------------------------
299 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
300 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
301 ////////////////////////////////////////////////////////////////////////
302 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
303 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
304 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
305 //######################################################################
306 //**********************************************************************
307 //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
308 //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
309 //......................................................................
310 //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
311
312 var abc = 123_456_789
313 abc
314
315
316 //在数组中存放元组
317 var array : Array = [(Int, String)]()
318 for i in 1...10 {
319 var tuple = (i, "\(10 * i)")
320 array.append(tuple)
321 }
322
323
324 //在字典中使用元祖作为value
325 var dic = Dictionary<String, (Int, Int, Int)>()
326 dic["tuple"] = (1, 2, 3)
327
328
329 //在字典中使用数组作为value
330 var array2 = ["a", "b"]
331 var dic2 = ["key" : array2]
332
333 var dic3 = ["key1" : "value1", "key2" : "value2"]
334
335
336 //元组里放数组
337 //
338 var array3 = [1, 2]
339 var array4 = ["a", "b"]
340 var tuple2 = (array3, array4)
341
342 var tuple = ([1, 2], ["a", "b"])
343
344
345 //Optionals可选类型
346 //在swift中使用可选类型声明变量来处理值可能为nil的情况,如果有值,那就是这个值,如果没有值那就是没有
347 var values : Int? //?表示值是可选类型的,有可能是nil
348 //Optional
349 let numberStr = "12345"
350 values = numberStr.toInt()
351 //强制解析可选类型
352 values!
353
354 var value1 = values!
355 //用!隐式解析可选类型去掉nil的情况
356
357
358 var values1 : Int!
359 let numberStr1 = "12345a"
360 values1 = numberStr1.toInt()
361 values = numberStr1.toInt()
362 //values!
363 //!表示的表示确实有值,而不是nil
364
365 //=========================================================
366 //函数
367
368 //函数定义
369 /*
370 func 函数名 (参数列表) -> (返回值类型) {
371 代码块
372 }
373 */
374
375 func sayHi (name: String) -> (String) {
376 return "Hi" + name
377 }
378
379 sayHi("QiaoDaye")
380
381 //多个参数,参数之间用逗号隔开
382 func sayBye (name: String, toName: String) -> String {
383 return name + ":Bye! " + toName
384 }
385
386 sayBye("XiangWang", "GuoZhong")
387
388 //返回值为多个参数, 返回值为元祖类型
389 func sayInfo (name: String, age: Int) -> (String, Int) {
390 return (name, age)
391 }
392
393 sayInfo("张三", 20)
394
395
396 //外部参数名
397 func sayGoodBye (#personName: String, #toPersonName: String) {
398 println("\(personName):\"\(toPersonName), goodbye!\"")
399 }
400
401 sayGoodBye(personName: "张三", toPersonName: "李四")
402
403 //默认参数
404 func sum (startNumber: Int = 0, #endNumber: Int) -> Int {
405 var sum: Int = 0
406 for i in startNumber...endNumber {
407 sum += i
408 }
409 return sum
410 }
411
412 sum(endNumber: 100)
413
414
415
416
417 //函数类型 参数类型和返回值类型组成
418 //TODO
419 var funcType: (String, String) -> String = sayBye
420
421
422
423 //nil Nil NULL NSNull的区别
424 //nil 指向不存在的对象指针
425 //Nil 指向零的类指针
426 //NULL 0
427 //NSNull 空对象
428
429 //optional可选类型
430 var value: Int? //?表示值可能为nil 也可能有值
431 let testOptional = "123"
432 value = testOptional.toInt()
433 value
434
435 if value != nil {
436 value! //! 强制解析
437 } else {
438 value
439 }