1.
OC 的gcd、runtime是开源的,UIKIT是闭源的;
WWDC会议有对语言的新特性的讲解,维持一周,现在主推Swift语言。
2.
所有的声明和实现都在同一个文件中;
没有.h和.m文件。
3.
整数默认类型是int long
小数默认类型是double
(oc中的CGFloat 是单精度的)
数据的类型是自动推导的,能根据 ’=’ 右边的数据来确定具体的数据类型;
不同类型的数据无法直接进行计算,不支持隐含形式转换。
let修饰的数据一经赋值就不可修改,不可变。
var修饰的变量可变。
推荐使用let,安全,等需要修改的时候再改成var。
示例:
func demo1 () {
var a = 10
var a = 10
a = 12
let b:CGFloat = 11.1
// b = 13 // b的值不可改变
let c = CGFloat(a) + b
print(c)
print(c)
}
4. 可选项 ?
fatal 致命的
unwrapping 强制解包
运算符需要加空格分开。
func demo1() {
/*
?表示可选类型,简单理解为“有吗?” 有值就是具体类型的值,没有就是nil。
打印可选项会带上 optaional。
常报错:
fatal error: unexpectedly found nil while unwrapping an Optional value
格式:var a: Int?
在使用强制解包的时候,可能会有风险。
如下示例,一旦a的值为nil,强制解包就会报错。
*/
var a: Int? = 10
// 每使用‘!’ 都要思考是否安全?
print(a!)
var a: Int? = 10
// 每使用‘!’ 都要思考是否安全?
print(a!)
}
5.分支结构
条件不用再写圆括号( )
大括号{ }不能省略
在swift语言中没有非零即真的概念,只有true 和false,好处是不用担心忘写非!
如:不用担心if(!dataList) 中忘写’!’。
6.if let
if let 表示赋值,并且判断是否为空;
if let url = NSURL(string: string){
let request = NSURLRequest(URL: url)
print(request)
print(request)
}
7.guard let … else
示例:
func demo4(){
let string = "http://www.baidu.com?username=zhang"
// guard let 可以减少嵌套,增强可读性
// guard let 可以减少嵌套,增强可读性
guard let url = NSURL(string: string) else{
// // 无法直接访问到url
// print(url)
return
}
// 程序走到这里一定有值
print(url)
// print(url)
return
}
// 程序走到这里一定有值
print(url)
}
8. ??
所有可选项都不能直接参与运算。
func demo5(){
var a: Int? = 10
// >>快速判断是否为空,并且设置默认值
// 实际运用在获取数据源的个数,用的非常多
// ??运算符优先级较低
print((a ?? -1) + 11)
// 实际运用在获取数据源的个数,用的非常多
// ??运算符优先级较低
print((a ?? -1) + 11)
}
9. switch 分支结构
/*
1. break可以省略;
2. case的条件中,至少有一段可以执行的代码,否则报错
1. break可以省略;
2. case的条件中,至少有一段可以执行的代码,否则报错
3. 在 case 中定义变量,不需要加 { }
4. case 的类型可以是任意类型,在c中只能是整型数据
5. case 可以同时case多个条件
*/
func demo6(){
let i = "100"
switch i {
case "100","120":
let str = "花花"
print("花无缺")
case "200":
print("小鱼儿")
default:
print("其他")
}
*/
func demo6(){
let i = "100"
switch i {
case "100","120":
let str = "花花"
print("花无缺")
case "200":
print("小鱼儿")
default:
print("其他")
}
}
10.循环
/*
仿OC循环
1.循环的条件可以省略()
2.递增的变量不能使用let
*/
func demo1(){
for var i = 0;i<10;i++ {
print(i)
}
仿OC循环
1.循环的条件可以省略()
2.递增的变量不能使用let
*/
func demo1(){
for var i = 0;i<10;i++ {
print(i)
}
}
// swift循环,不包含10
func demo2(){
for i in 0..<10{
print(i)
}
func demo2(){
for i in 0..<10{
print(i)
}
}
// 循环 包含10
func demo3(){
for i in 0...10{
print(i)
}
func demo3(){
for i in 0...10{
print(i)
}
}
// _表示忽略
func demo4(){
for _ in 0..<10{
print("Hello World")
}
func demo4(){
for _ in 0..<10{
print("Hello World")
}
}
11. 字符串
/*
OC 中的 NSString 继承自 NSObject ,是一个对象,效率略低,不支持遍历
SWIFT 中的 String是一个结构体,更加高效,支持遍历
*/
func demo1(){
let str = "花无缺"
for s in str.characters{
print(s)
}
// NSUTF8StringEncoding 是取字符编码的长度,中文的字符编码长度是3
let length = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
OC 中的 NSString 继承自 NSObject ,是一个对象,效率略低,不支持遍历
SWIFT 中的 String是一个结构体,更加高效,支持遍历
*/
func demo1(){
let str = "花无缺"
for s in str.characters{
print(s)
}
// NSUTF8StringEncoding 是取字符编码的长度,中文的字符编码长度是3
let length = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
print(length) // 打印结果是9
let l = str.characters.count
print(l) // 打印结果是3
print(l) // 打印结果是3
}
func demo2()
let str1 = "你若安好"
let str2 = "便是晴天"
let str = str1 + str2
print(str)
print("\(str1)\(str2)")
let i:Int = 10
print("\(i)便是晴天")
let j:Int? = 10
print("\(j)便是晴天")
}
/*
你若安好便是晴天
你若安好便是晴天
10便是晴天
Optional(10)便是晴天
let str2 = "便是晴天"
let str = str1 + str2
print(str)
print("\(str1)\(str2)")
let i:Int = 10
print("\(i)便是晴天")
let j:Int? = 10
print("\(j)便是晴天")
}
/*
你若安好便是晴天
你若安好便是晴天
10便是晴天
Optional(10)便是晴天
*/
// 字符串的比较
func demo3(){
let str1 = "ye"
let str2 = "liang"
let str2 = "liang"
if str1 == str2{
print("ai")
}else{
print("wo")
}
}else{
print("wo")
}
}
// 字符串和range 截取字符串
func demo4(){
// 将string 转换成NSString之后再去截取
let s1 = "yuanlairuci"
let s2 = (s1 as NSString).substringWithRange(NSMakeRange(4, 3))
print(s2)
func demo4(){
// 将string 转换成NSString之后再去截取
let s1 = "yuanlairuci"
let s2 = (s1 as NSString).substringWithRange(NSMakeRange(4, 3))
print(s2)
}
========================
12.数组的基本操作
func
demo1() {
/*
1. 数组中不建议存放不同类型的对象
2.let 修饰的数组是不可变的
3.
/*
1. 数组中不建议存放不同类型的对象
2.let 修饰的数组是不可变的
3.
*/
var
arr = [
"wo"
,
"ni"
,
"ta"
]
for
str
in
arr{
print (str)
}
// 向数组中添加元素
arr. append ( "she" )
print (arr)
// 修改元素
arr[0] = "huawuque"
print (arr)
// 数组的删除
arr. removeAtIndex (2)
print (arr)
arr. removeFirst ()
print (arr)
arr. removeLast ()
print (arr)
arr. removeAll ()
print (arr)
print (str)
}
// 向数组中添加元素
arr. append ( "she" )
print (arr)
// 修改元素
arr[0] = "huawuque"
print (arr)
// 数组的删除
arr. removeAtIndex (2)
print (arr)
arr. removeFirst ()
print (arr)
arr. removeLast ()
print (arr)
arr. removeAll ()
print (arr)
}
//
数组的拼接
func
demo2() {
let
arr1 = [
"ni"
]
let arr2 = [ "wo" ]
let arr = arr1 + arr2
print (arr)
let arr2 = [ "wo" ]
let arr = arr1 + arr2
print (arr)
}
13.字典的基本操作
//[key : value]
键值对
func demo1() {
var dict = [ "name" : "fanbingbing" , "age" :30]
// 增加键值对
dict[ "title" ] = " 女神 "
// 根据 key 修改 value
dict[ "name" ] = "linzhiling"
// 删除
dict. removeValueForKey ( "age" )
print (dict)
// swift 字典的遍历 , 跟 for 后面 ( ) 中的变量名无关;
// for (key,value) in dict{
for (a,b) in dict{
print ( "key = \ ( a )" )
print ( "value = \ ( b )" )
}
}
/*
打印结果:
["title": 女神 , "name": linzhiling]
key = title
value = 女神
key = name
value = linzhiling
func demo1() {
var dict = [ "name" : "fanbingbing" , "age" :30]
// 增加键值对
dict[ "title" ] = " 女神 "
// 根据 key 修改 value
dict[ "name" ] = "linzhiling"
// 删除
dict. removeValueForKey ( "age" )
print (dict)
// swift 字典的遍历 , 跟 for 后面 ( ) 中的变量名无关;
// for (key,value) in dict{
for (a,b) in dict{
print ( "key = \ ( a )" )
print ( "value = \ ( b )" )
}
}
/*
打印结果:
["title": 女神 , "name": linzhiling]
key = title
value = 女神
key = name
value = linzhiling
*/
14.函数
/*
函数的基本格式
func 函数名(参数名:参数类型) -> 返回值类型
*/
func sum(a: Int , b: Int ) -> Int {
return a+b
函数的基本格式
func 函数名(参数名:参数类型) -> 返回值类型
*/
func sum(a: Int , b: Int ) -> Int {
return a+b
}
/*
引入函数的外部参数
能够让外界调用,对函数的语义更加清晰,在函数内部使用更加简洁
*/
func area(height a: Int , width b: Int ) -> Int {
return a*b
}
// 函数没有返回值的三种写法
func demo1(str: String ) -> Void {
print (str)
}
func demo2(str: String ) ->(){
print (str)
}
func demo3(str: String ) {
print (str)
引入函数的外部参数
能够让外界调用,对函数的语义更加清晰,在函数内部使用更加简洁
*/
func area(height a: Int , width b: Int ) -> Int {
return a*b
}
// 函数没有返回值的三种写法
func demo1(str: String ) -> Void {
print (str)
}
func demo2(str: String ) ->(){
print (str)
}
func demo3(str: String ) {
print (str)
}
15.
oc中的block什么情况下会造成循环引用,闭包,怎么解决的?
__unsafe的风险。
16.
block是提前准备好
__weak一般在调用层进行添加,不在工具类Tool类添加。
17.按ESC可以补全没写全的方法
18.闭包的特点:
19.
/*
block(闭包)的特点:
1.
提前准备好的一段可以执行的代码
2.block 可以当做参数传递
2.block 可以当做参数传递
3.在需要的时候执行block
4.在block中使用 self 有可能产生循环引用
20.block理解
a. 闭包和block都是作回调用的。
b. block、闭包回调是通过参数来传值。
c. 闭包中访问自己的方法,必须要加self。
d.
在
block
中
访问
self,
会对外部变量
做
copy。
e. __weak weak 修饰的
对象当被系统回收的时候
,
对象的地址会自动指向
nil,
给
nil
发送消息,
在
OC
中是可以的,
不会造成野指针访问,
iOS5.0推出。
f. __unsafe_unretained
相当于
assgin
关键字,
修饰的
对象当被回收时,
对象地址不会指向
nil,
iOS 4.0
推出。
g. MRC
开发下
最常见的
错误之一:
坏内存地址访问,俗称
野指针访问。
h.
在异步方法中如果能直接执行
block
就直接执行,
如果不需要立即执行;
就需要用一个属性来
记录
block,
在需要的时候执行。
i.
解决循环引用最终的一点:就是打破强引用循环。
j.
注意
:
循环引用,
并没有那么容易出现。
k.
只有在有【成员变量】
或者【属性】
对外部的
block
进行了记录,
这时
就需要考虑循环引用。
*/
21.
析构函数与 OC 的dealloc方法的作用是一致的。
22.
swift中的当发现一个对象为nil,不会给它发送任何消息;
而OC中会发送消息,但没有任何作用。