swift是一门强语言,很多地方比OC写的要严谨的多。今天总结一下swift和OC的区别,以及一些融通易犯错的地方,希望对需要的人有所帮助
在swift中,没有main 函数的概念,没有.h 和 .m 文件,一个类,只用一个swift来表示;
可以不写分号,如果一行当中有多条语句的时候分号就必须写;
采用print函数来代替NSLog函数打印数据,而且苹果建议我们这样,print函数比NSLog效率高,在print函数里,没有占位符的概念,如果要插入参数采用 \ ()
let a0 = 10
print"a0 = \(a0)"
变量和常量
在swift中,变量和常量分别用var let 来表示,格式 : let/var 名字 = 初始值 , 不用明确指出变量和常量的类型,xCode 会根据你的初值自行推导出具体类型
let a0 = 10 // 常量一经赋值就不能改变
let a1 = 20.3625
var a2 = 22
a2 = 30 //变量可以改值
常用的数据类型
在OC中,一个整型int可以和一个浮点型的数进行相加,但在swift中不存在隐式转换,不同数据类型之间,不能做运算。做运算之前必须进行强制类型转换。格式: let/var 名字: 数据类型 = 初始值
let a1:Int = 21
var a2:Double = 123.23
print("a1 = \(a1),a2 = \(a2)")
let b1 = a1 + Int(a2) //如果是 a1 + a2,就会报错
let a3:Bool = true // 布尔值的两个值:true false
let a4:Character = "1" // 字符类型采用character 并且双引号赋值
var a5:String = "hello world" // 在swift当中采用string表示一个字符串 ,双引号赋值,不是OC中得对象而是结构体
字符串及一些基本API
var str = "hello"
print("长度 = \(str.characters.count)")
// 拼接字符串采用 += 拼接字符采用append 函数
var str1 = "world"
str += str1 // = helloworld
let c:Character = "c"
str.append(c) // = helleoc
if(str1 == "world") { // 判断两个字符串是否相等 不用isEquealToString
print("相等")
}
if(str1.hasPrefix("wo")) { // 前缀
print("前缀是world")
}
if(str1.hasSuffix("ld")) {
print("后缀 ")
}
print("str1的大写\(str1.uppercaseString)") // 转化为大写
let str2 = "2158JDOF"
print("str2的小写\(str2.lowercaseString)") // 转化为小写
for item in str.characters{ // 字符串支持遍历
print(item)
}
let str4 = str1 as NSString // swift 里面的字符串,跟OC里面的字符串可以互相转化
数组和字典 ,swift和OC语法不同,但很多API的调用接口还是差不多的
在swift 中,数组的类型是array ,创建一个数组或字典的时候,必须明确的指出,数组里面元素的类型 跟OC里面的数组NSArray 可以相互转换 用as
// 数组的可变不可变,取决于用let 还是var
var array1:[String] = ["12","34","56","78"] //可变数组
let array2:[String] = ["12","34","56","78"] // 不可变数组
array1.append("90") // 增加元素
array1 .removeAll(keepCapacity: true)// 移除所有的元素,但是内存大小保留
// 元组遍历 下标和值
for (index,value) in array1.enumerate() {
print("index = \(index),value = \(value)")
}
// 字典 Dictionary
var dic:[String : AnyObject] = ["1":"a","2":"b"]
var dic1:[String : AnyObject] = ["3":"a","4":"b"]
// 增加 和 更新.如果key存在就是一个更新的操作,如果不存在就是添加的操作
dic["3"] = "c"
dic.removeAtIndex(dic.indexForKey("3")!) //删除指定下标
dic.removeValueForKey("1")
// 元组遍历
for (key,value) in dic .enumerate(){
print(key,value)
}
// 获取所有的key dic.keys 获取所有的value dic.values
// 合并两个字典
for item in dic.keys {
dic1[item] = dic[item]
}
可选类型
如果一个值可能有值,也可能为nil 那么这个变量或者常量就是可选类型 可选类型用? 标识出来,打印数据包含Optional字样
var a1:Int? = 22
?? 空运算标识符 如果可选类型值不为空的话,会帮我们进行强制解包之后参与运算,如果可选类型为空,则提供一个默认值给我们参与运算
var value:Int? = 10
let value1 = (value ?? 5) + 20 // 结果为30
var value2:Int?
let value3 = (value2 ?? 5) + 20 // 结果为25
let b1 = 10
let c1 = a1! + b1 // 可选类型不能直接参与运算,参与运算之前,必须强行解包,强制解包用!标识
警告,在对一个可选类型进行强制解包之前必须确认这个可选类型不能为nil 否则会报错 unexpectedly found nil while unwrapping an Optional value
在模型(KVC)里面,所有的基本数据类型,不可以为可选类型,否则的话,在字典转模型的时候(setValuesForKeysWithDictionary)找不到这个key
解决的方法是:给默认值0 let age:Int = 0
枚举
swift 一个枚举成员不局限于关联整型数据,也没有默认值,
enum Month:String{ // 如果枚举关联的是一个整形的话,第一个赋值了之后,后面的枚举值会自动累加。如果是非整形的话,就必须给每一个枚举赋值
// case January,case February, case match // 两种赋值方式
case January = "一月"
case February = "二月"
case Match = "三月"
}
var month = Month.January
month = .Match //如果一个枚举类型已经制定的话,下次赋值的时候可以通过.这种方式进行再次赋值,省略前面的类型
print(month.hashValue)// 哈希值,就是在枚举里的小标
print(month.rawValue)// 获取枚举成员的默认值,rawValue
控制流
- if后面的小括号可以省略,大括号不可以省略,swift 中后面的条件语句,没有“非0即真”得概念
2 可选类型的判断用 if-let,先判断可选类型是否为空,不为空的话,创建一个局部的常量来接受此时这个可选类型的值,再执行代码块,为空,则不执行代码块
let a1:Int? = 10
if let b = a1 {
print("b = \(b)")
}
// if-let-where where 是对定义出来的常量再做一层判断
if let c = a1 where c > 5{
print("a > 5")
}
// guard 守护 是判断可选类型是否有值,没有值的话执行else里面的代码块,有值的话,执行else 后面的代码块
func demo() {
let a2:Int? = 10
guard let d = a2 else {
print("a = nil")
return
}
print("a != nil = \(d)")
}
demo()
switch 后面的小括号可以省略, case 后面的break 可以不写,不会造成传统的效果。默认default必须添加 而且只能添加在最后面。case 后面必须有一条执行语句,而且如果有多条语句,case后面的大括号可以省略。switch 不再像OC那样,值局限于整型的选择
let a = 10
switch a {
case 3:
print("a == 3")
case 10:
print("a == 10")
default:
print("a == nil")
}
let score = "优"
switch score{
case"优":
print("")
case"良":
print("")
default:
print("")
}
循环 for while
for 后面的小括号不能写,大括号必须加上,在swift2.2之后废弃了
// 写法1
for var i = 0;i < 10;i++ {
print("i = \(i)")
}
//写法2
for i in 0...10 { // [0,10]闭区间
print(i)
}
for i in 0..<10 {// [0,10)左闭右开
print(i)
}
// while 循环
var i = 10
while i > 1 {
print(i)
i--
}
// do - while 在swift中不存在 ,取代的是repeat-while
var i1 = 10
repeat {
print(i1)
i--
}while i > 5