Swift初体验
2016-01-17 22:52
357 查看
Swift特色
可以使用现有的 Cocoa 和 Cocoa Touch 框架Swift 取消了
OC 的指针及其他不安全访问的使用
舍弃了 OC 早起应用 Smalltalk 的语法,全面改为句点表示法
提供了类似 Java 的名字空间(namespace),泛型(generic),运算对象重载(operator overloading)
Swift 被简单地形容为
没有C 的 OC
Swift 与 OC 的不同
Swift 中得类文件都是以 .swift 结尾的,没有 OC 中的. h 与. m没有
main.m文件,@ UIApplicationMain 标识程序入口
使用大括号
{}标识嘞的范围及方法范围
OC 中得
initWithXX对应 Swift 中的
init(XX:),也可以用(xx:)的形式去访问,前面省略了
. init
Swift 中调用类方法
类名.方法名()
代码后不用加分号,一行就代表一行代码,如果想把多行代码写一行,可以使用
;分开
在 Swift 中,枚举分为两部分:枚举名,枚举值名,枚举名可以省略
在 Swift 中,访问当前类的变量/其他 可以不使用
self
Playground 介绍
就是一个文件基本语法
let语法
let 常量—-值不能更改,但是可以修改它的属性不需要指定类型,会自动进行类型推导
不同类型之间不能进行计算(例如 int 不能与 double 计算)
需要把其中一个转换类型,例如 let a = 1; let b = 1.2; let : Int result = a + Int(b)
空格大法 操作符的左右空格必须对称,否则会报错
没有隐式转换
Swift 对数据类型要求异常严格任何时候,都不会做隐式转换
如果要对不同类型的数值进行计算,必须对其中一个数值做
显示转换
可选项
optional: 代表一个变量/常量可能有值,可能为 nil
例如用户头像,有可能用户上传过,也可能没有
?: 修饰变量/常量 是一个可选值
!: 告诉系统该
可选值中一定有值,可以,就可以直接参与计算,如果使用了
!,但是没有值,就会报错
在使用
!号时一定要谨慎,确定里面是否有值
??: 其用于判断可选值是否为空,如果可选值不为空,就直接取其值,否则就取
??后面的值
例如 (a ?? 0) + 10
可选值不能直接参与计算
如果没有值,打印 nil, 如果有值,打印结果会带有
Optional
用法1:没有赋值 var a: Int?,print(a)
打印结果: nil
用法2:赋值 var a: Int?,print(a) = 10
打印结果: Optional(10)
if语句
没有小括号 ‘()’可以省略必须写大括号
{},即使只有一句代码,也要写
没有
非0即真的概念, 必须要指定条件语句的结果为
true或者
false
if let 固定用来判断值是否有值
与 where 联合使用, where 后语句执行结果,必须是 true 或者 falseguard 语法
guard let u = url else{return} .守护 u 有值,如果没有值,才会进入到大括号里事例程序
““//1.NSURL 中只有中文时,无法初始化成功
let url = NSURL(string: “http://www.baidu.com/遮罩”)
//2.if let 只有当 u 中有值的时候才会进入大括号 if let u = url{ print(u) } //guard let确保 u 一定有值,只有当没有值的时候,才会进入 else 中,而且大括号中一定要有 return //一旦 u 没有值,就会进入大括号中,然后就 return, 结束当前函数,后面的语句就会执行 guard let u = url else{ print("hello nil") return } print("hello amos") print(u)
““
打印结果:
hello nil
switch 语法
没有 break, 可以不用写 break,但是 case 后必须跟一行代码可以判断任意类型,不像 OC 中得 switch 只能判断整形
不用使用大括号来区分 case 中变量的作用域
case let where 可用于条件语句,类似于 OC 中得 case 穿透
事例程序:
““
““
for 循环
事例代码““
for var i = 0; i < 5; i++ {
print(i)
}
print("====================") //取值范围[0,10),可取0到9 for i in 0..<10{ print(i) } print("====================") //取值范围[0,10],可取0到10 for i in 0...10{ print(i) }
““
while
在 Swift2.0中, do while 已更改为repeat while事例代码
““
var a = 9
while a > 0{ a-- print(a) } print("===========") a = 9 repeat { a-- print(a) }while a > 0
““
字符串 String
Swift 中.字符串使用String,其实是一种结构体,比
NSString轻量级,速度更快
String 可以支持直接遍历
String 可以与 NSString 无缝转换
NSString 里面有些操作字符串的方法
String中没有
事例代码
““
let str = “别低头,绿帽会掉”
//直接遍历字符串的字符 for s in str.characters{ print(s) } //打印 utf8编码下的字节长度 print(str.utf8.count) //打印指定编码下的字节长度 print( str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) //打印字符串长度 print(str.characters.count)
““
拼接字符串的三种方式
事例let c = 10 let name = "老王" //第一种方式 let result = "我叫" + name + ",年龄" + String(c) //第二种方式:在字符串中使用\(变量名) 拼接字符串 let result2 = "我叫\(name),年龄\(c)" //第三种方式:string format 方式 let result3 = String(format: "我叫%@,年龄%d", name, c)
截取字符串
事例let str = "听说下雨天和辣条更配哟" //1.下标截取 let r1 = str.substringFromIndex("听说".endIndex) print(r1) //2.截取到倒数第三位 let r2 = str.substringToIndex(str.endIndex.advancedBy(-3)) print(r2) //3.计算 rangge 的开始与结尾 let startIndex = str.startIndex.advancedBy(2) let endIndex = str.endIndex.advancedBy(-3) let r3 = str.substringWithRange(startIndex..<endIndex) print(r3)
打印结果:
下雨天和辣条更配哟 听说下雨天和辣条 下雨天和辣条
数组
与 OC 的不同
可以约束数组中可放置元素的类型事例
ar arr1 = ["老王", "老李", 18] print(arr1) //1.按照下标取数组中值 print(arr1[1]) //2.在数组末尾添加元素---数组必须是 var 定义的--可变 arr1.append("呵呵哒") //3.移除元素 arr1.removeFirst(1) print(arr1) //4.初始化一个空的数组--可变 var arr2 : [Int] = [Int]() print(arr2) //5.添加一个整形数值,如果添加字符串或者其他类型就会报错 arr2.append(18) arr2.append(19) print(arr2) //6.1遍历方式一 for var i = 0; i < arr2.count; i++ { print(arr2[i]) } //6.2遍历方式二 for value in arr2{ print(value) } //6.3遍历方式三 for (index,value) in arr2.enumerate(){ print("index\(index); value\(value)") } //7.数组合并---同类型数组才能合并 let array1 = ["老王"] let array2 = ["老李","la"] let array3 = array1 + array2 print(array3) //8.数组容量 print("数组容量",array3.capacity)
字典
字典中取出的值是可选值事例
//1.定义字典--此时 dict1是字典([String : NSObject])类型 var dict1 = ["name":"老王", "age":18] //1.1打印字典 print(dict1["name"]) //1.2 添加键值对 dict1["no"] = "呵呵哒" print(dict1) //1.3移除键值对 dict1["age"] = nil //2.定义一个空的可变字典 var dict2 = [String : NSObject]() print(dict2) //2.1添加键值对 dict2["name"] = "老王" dict2["age"] = 19 print(dict2) //3.遍历字典 for (key ,value) in dict2 { print("key:\(key), value:\(value)") } //4.0 dict4是[String : String] var dict4 :[String : NSObject] = ["name":"老王", "age":"22"] //4.1.字典的合并--dict3是[String : NSObject]字典类型 let dict3 = ["nick":"老李", "no":2] //此时如果直接赋值会报错,要把 dict4定义成[String : NSObject] for (k,v) in dict3{ dict4[k] = v }
函数
事例//1.定义一个没有参数没有返回值的函数 //格式: func 函数名(){函数执行代码} func func1(){ print("定义一个没有参数没有返回值的函数") } //2.定义一个有参数没有返回值的函数 func func2(a: Int, b: Int){ print(a + b) } //如果没有'外部参数'的话,第一个参数的名字默认省略 func2(10, b: 50) //外部参数--提供给外部调用者使用的参数而不会在函数内部使用---使调用者更加明白参数的含义 //格式: func 函数名(外部参数名1 形参名1: 类型 ...){代码} func func3(num1 a: Int, num2 b: Int){ print(a + b) } func3(num1: 10, num2: 20) //3.定义一个有参数有返回值的函数 //格式: func 函数名(外部参数名1 形参名1: 类型 ...) -> 类型{代码} func func4(num1 a: Int, num2 b: Int) -> Int{ return a + b } let result = func4(num1: 2, num2: 3) print(result) //4.没有返回值的三种表示方式 //4.1 func demo1(){ } //4.2 func demo2() -> (){ } //4.3 func demo3() -> Void{ } //5.在函数中嵌套定义一个子函数 func demo4(){ //---此处还不能调用 demo5 func demo5(){ print("嵌套子函数") } //demo5只能在 demo4中,而且只能从定义结束到 demoe4的结束这个域内可使用 demo5() } //调用 demo4 demo4()
闭包
事例/** * 1. 闭包---与 OC 中得 block 类似,是一个预先定义好的代码块,在需要的时候去执行 2. 内部如果使用 self 的话,也需要考虑循环引用 */ //1.使用嵌套定义子函数的形式 func demoA(){ func test(){ print("test") } test() } demoA() //2.使用闭包--是() -> () 类型--即没有参数,没有返回值 func demoB(){ //2.1定义闭包 let test = { print("测试闭包") } //2.2调用闭包 test() } demoB() //3.有参数无返回闭包 func demoC(){ //3.1定义闭包 let test = {(num1 a: Int, num2 b: Int) -> () in print(a+b) } test(num1: 10, num2: 20) } demoC() //4.有参数有返回闭包 func demoD(){ //4.1定义闭包 let test = {(num1 a: Int, num2 b: Int) -> Int in return a+b } let r = test(num1: 10, num2: 20) print(r) } demoD() //5.没有参数没有返回值闭包的三种表示方式 func demoE(){ //5.1 let test1 = { () -> () in //代码 } test1() //5.2 let test2 = { () -> Void in //代码 } test2() //5.3 let test3 = { //代码 } }
闭包使用
举例//方式一: let finished = { (value: String) -> ()? in print(value) } loadData(finished) //方式二:尾随闭包,如果闭包作为函数的最后一个参数时,括号可以提前关闭,该闭包可以写在函数外面 loadData { (value) -> ()? in print(value) } //方式三:与方式二同理 loadData( { (value) -> ()? in print(value) }) } func loadData(finished : (value: String) -> ()?){ //方式二:尾随闭包,如果闭包作为函数的最后一个参数时,括号可以提前关闭,该闭包可以写在函数外面 dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in //模拟网络延迟 NSThread.sleepForTimeInterval(1) let result = "闭包测试" //转到主线程 dispatch_async(dispatch_get_main_queue(), { () -> Void in finished(value: result) }) } }
相关文章推荐
- swift手记-1
- Swift获取命名空间(namespace),动态加载类
- Swift学习笔记8--Optional Chaining
- Swift学习笔记7--访问控制
- swift-var/let定义变量和常量
- 【iOS】彩虹渐变色 的 Swift 实现
- iOS 集成银联支付swift
- swift错误:expected a digit after integer literal prefix
- swift枚举
- 斯坦福公开课:Developing IOS 8 App with Swift(1-3)心得体会
- Swift ! ? 符号区别
- [Swift开发实战]-类的使用02
- swift入门———函数
- 扒取系统控件 设置系统控件属性
- 玩转Swift(一)
- iOS_Swift UIScrollView之App导航页的制作
- Swift学习之continue、break、fallthrough
- Get all Ethernet information in Swift
- The Swift Programming Language中文/英文版
- 我从55个Swift标准库协议中学到了什么?