- 创建对象: '
- OC: alloc / initWithXXX
- Swift: (XXX:)
- 调方法
- OC [UIColor redColor];
- Swift: UIColor.redColor()
- 枚举:
- OC: UIButtonTypeContactAdd
- Swift: UIButtonType.ContactAdd
- 创建结构体:
- OC CGPointMake()
- Swift : CGPoint()
常量和变量
- 以前在OC中的数据类型首字母要大写,比如Int/Float
- 常量用let,注意只能初始化一次
- Swift中尽量推荐用let,只有需要修改变量的时候才用var
let num : Int
num = 33
let num2 : Int = 44
var value : Double
value = 22.3
var value2 : Double = 33.33
- 自动类型推导:如果在定义的同时初始化,那么可以不用写数据类型,编译器会根据内容自动推导出当前的数据类型:
var num = 22.3
- 数据类型转换:必须手动显式转换.Swift中永远不会自动转换(强语言)。CGFloat和Double之间也必须转换
var n1 = 10.1
var n2 = 10
var sum = n1 + n2 // 这么写是错的,OC中会隐式转换,Swift中不会
var sum = n1 + Double(n2) // 必须这么写
分支
- if:swift中可以省略if后面的圆括号。OC中如果大括号中只有一条语句,可以省略大括号,swift中不行
let num = 10
if num == 10
{
print("num是10")
}
- Swift中提供了真正的BOOL类型:true/false。if后面的条件表达式必须是true/false。用到这里,最直接的改变以前的
if (num) {}
这么写是错的了
- switch:同样可以省略switch后面的圆括号。可以不用写break
- switch在OC中想在case后面定义变量,必须加大括号,而swift中不需要
- switch在OC中defult可以随便放在哪里,或者不用谢,swift中必须放在最后一条,而且大部分情况下必须写
三目运算符
- 注意运算符之间需要有空格。
大括号如果不换行,前面也要有空格
let num = 10
let res = (num == 10) ? 10 : 5
可选类型Optional ? !看到问号或者感叹号那么说明是可选类型
- 含义:可以有值,也可以没有值。只有可选类型才可以赋值nil
- alt+单击该变量,可以发现它的类型后面有个问号
?
所以如果一个变量如果点开看没有问号,那么表示它一定有值
- 如果打印这个类型,那么会在前面自动加个Optional
- 如果不想要Optional,可以在变量后面加个!,代表告诉系统该变量一定有值,就不会加Optional(称为强制解包)注意如果对nil执行了强制解包,那么会引发运行时错误
let url = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
print(url)
print(url!)
let url1 = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
print(url!)// 此处会崩,因为url1后面有中文,导致url1为nil,对nil强制解包会崩
- 所以一般在强制解包前作个判断是否为空
if url != nil
可选绑定
- 每次强制解包前还要作判断,太麻烦,所以swift提供了可选绑定
- 格式:
let url = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
if url2 = url{ print(url2) // 这里不会打印,因为url为nil,上面的if会过滤掉
}
let url3 = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
if url4 = url{ print(url2) // 这里会打印,而且不带Optional,系统会自动解包
}
guard守护
- 可先绑定写得多了,会导致判断太多(if套if)可读性差。用guard来解决这个问题:判断条件如果为假,那么执行大括号里的,否则继续往下走
- 大多数情况用可选绑定,但是注意如果就算有空值,仍希望代码继续往下走的,要用可选绑定(if完了后面再跟if,不是嵌套)
guard 判断条件 else{
return
}
- 注意guard大括号里必须要有return或者continue
guard let url2 = url else{
print("url2为空")
return
}
// 能来到这里说明url2肯定有值
print(url2)
自动解包
- 直接这么写会报错:因为数据类型不对,前面的变量url是NSURL?类型的
let url : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url1 : NSURL? = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url2 : NSURL! = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url3 : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))!
- 如果数据类型后面带了感叹号了,那么在使用该变量时会自动解包。而问号则不会。比如上面打印url2和url3不会带Optional
- 但是,注意变量后面别随便带感叹号,因为如果变量为nil,就会报错
??判断
- 用于判断前面的可选类型的参数是否是nil,如果是nil就返回后面的值
// 这里str是个可选类型
let str: String? = nil
// result不是可选类型(经过??判断之后,肯定有值)
let result = str ?? "123"
print(result)
断言
- 用于判断某个变量是否为空,如果为空,那么直接程序崩溃并且打印信息
assert(access_token != nil, "使用loadUserInfo()方法前必须先授权")
assert(uid != nil, "使用loadUserInfo()方法前必须先授权")
let params = ["access_token": access_token!,
"uid": uid!]
where
- 相当于并且,写在可选绑定后面。在这里可以拿到本句代码中定义的常量。(用&&拿不到)
if let sourceStr: NSString = status?.source where sourceStr != ""
{
let startIndex = sourceStr.rangeOfString(">").location + 1
let length = sourceStr.rangeOfString("<", options: NSStringCompareOptions.BackwardsSearch).location - startIndex
let rest = sourceStr.substringWithRange(NSMakeRange(startIndex, length))
sourceLabel.text = "来自\(rest)"
}
循环
for var i = 0;i < 10;i ++
{
print(i)
}
for item in ["1","2","3"]
{
print(item)
}
- swift特有写法:其中
0..<10
称之为半闭区间。
- 半闭区间:不包含头,包含尾
- 闭区间:
0...10
包含头尾
- 注意
...
之间不能有空格
for i in 0..<10 // 倒过来就是从后往前遍历
{
print(i)
}
var index = 0
while index < 10
{
print(index)
index ++
}
数组
- let代表不可变数组,var代表可变数组
- 前面不需要加@,会自动把基本数据类型转换成对象,不需要包装`var array = [10,"哈哈",9.9];
- 定义:var array:[String]? // 定义一个内容为string类型的数组,并且没有初始化加个问号
- 获取:print(array[1])
- 修改:array[1] = @"呵呵"
- 追加:array.append(33) 数组每次加内容,容量不够的话,每次会翻倍
- 删除:array.removeAtIndex(0)// 这个删除方法会这个删除的元素返回给我们
- 删除所有array.removeAll()
- 删除所有但保存原有容量array.removeAll(keepCapacity:true).灵活使用可以节省性能
- 合并:注意要相同类型才能合并
var array1 = [1,2,3]
var array2 = [4,5,6]
var array2 = ["4","5","6"]
array1 += array2 // 这样就完成了合并
// 让数组按照item的attribute属性来排序
array = array!.sort({ (item1, item2) -> Bool in
return item1.attribute > item2.attribute
})
字典
- OC:
@{key : value}
- Swift:
[key : value]
- 同样,let和var代表不可变和可变字典
// 定义方法1:定义的同时赋值
let dict1 = ["name" : "lhj","age" : 29]
// 定义方法2:定义指明类型,再赋值
let dict2:[String:AnyObject]
dict2 = ["name" : "lhj","age" : 29]
- 上面[String:AnyObject]类型是Swift中用的最多的字典类型,意思就是key是String类型的,value为任意对象
- 获取:
print(dict["name"])
- 注意:取出来的都是可选类型的值,因为根据这个key取值可能会取不到,返回的值可能是nil
- 可以在[]后面加个叹号,代表取出来的一定有值
print(dict["name"]!)
- 更新:dict["name"] = "zhangsan"
- 添加:dict["weight"] = 100
- 遍历
for key in dict.keys
{
print(key)
}
// Swift特有方法,会将字典中的key赋值给for后面的括号中的第一个变量,将value赋值给第二个变量(括号中的变量称之为元祖)
for (k,v) in dict
{
print(k)
print(v)
}
- 合并 :字典不能像数组那样+=来合并,只能遍历再一个个赋值。同样注意类型需一致
var dict1:[String:AnyObject] = ["name" : "lhj","age" : 29]
var dict2:[String:AnyObject] = ["score" : 99]
for (k,v) in dict1
{
dict2[k] = v
}