Swift的基本语法:
swift中的所有代码,都包含在最外侧的 {}中。
oc与swift比较:
1.oc的alloc initWithXXX 在swift中是 (xxx:)
2.oc中的类方法在swift中是.语法
3.oc中的枚举 在swift中用点语法隔开,也可以直接省略前缀,但不建议
例如: OC 的枚举 UIButtonTypeContactAdd
Swift 中 UIButtonType.ContactAdd
1>可以直接省略前缀 .ContactAdd,但是Xcode 的智能提示有的时候不给力
2> 如果没有智能提示,可以直接 `回车`,`->`,`.`
4、监听方法
swift直接使用字符串,提示:可以直接用智能提示,然后加引号和左右键,
如果有参数直接增加`:`
5. 没有分号 - 在程序语言中,`;` 用于拆分语句,表示一个完整的语句结束
Swift 中,大多数情况下不需要分号
例如:
leta = 10; let b = 20
6.所有的swift 程序如果崩溃在AppDelegate,都是oc的问题, oc是消息机制
7.变量和常量:
1.
let a = 20
// a = 30会报错,因为let是定义常量,一旦设置就不能修改
var b = 20
b = 40 //不会报错,因为var是定义变量,设置以后可以修改
2.
///自动推导 - 可以根据右侧的计算结果,推导出左侧变量/常量的类型
/// Option + Click 热键非常重要,可以快速查看变量的准确类型
/// 但是:Swift对类型转换要求非常严格,任何不同类型之间的数据,不允许计算
/// Int 和Double 都是结构体,而 不是基本数据类型!
func demo2() {
//整型默认类型是int,如果64位机器,long 、32位机器 ,int
let x = 10
// 在Swift中,小数默认是 Double ,双精度,精度比float高
//在 OC中, 默认是 float,浮点数
let y = 10.5
// print(x +y)会报错: Binary operator '+' cannot be applied to operands of type 'Int' and 'Double' ----如果要给不同类型的数据进行计算,必须手动转换类型。
// OC 中如果要做类型转换`(int)y`
// Swift中,使用的是`Int()` 构造函数 `init`
// 例子:
print(x + Int(y))
print(Double(x) + y)
//也可以这样转换:如果定义的变量/常量需要指定自己需要的类型,可以使用`:类型`
let a: Double = 10; let b = 20.9 //let a = 10; let b: Int = 20.9
print(a + b)
/// Option + Click 热键非常重要,可以快速查看变量的准确类型
/// 但是:Swift对类型转换要求非常严格,任何不同类型之间的数据,不允许计算
/// Int 和Double 都是结构体,而 不是基本数据类型!
func demo2() {
//整型默认类型是int,如果64位机器,long 、32位机器 ,int
let x = 10
// 在Swift中,小数默认是 Double ,双精度,精度比float高
//在 OC中, 默认是 float,浮点数
let y = 10.5
// print(x +y)会报错: Binary operator '+' cannot be applied to operands of type 'Int' and 'Double' ----如果要给不同类型的数据进行计算,必须手动转换类型。
// OC 中如果要做类型转换`(int)y`
// Swift中,使用的是`Int()` 构造函数 `init`
// 例子:
print(x + Int(y))
print(Double(x) + y)
//也可以这样转换:如果定义的变量/常量需要指定自己需要的类型,可以使用`:类型`
let a: Double = 10; let b = 20.9 //let a = 10; let b: Int = 20.9
print(a + b)
}
3.如果仅仅定义类型,并没有设置数值,会报一个没有初始化的错误: Constant 'x' used before being initialized
例子: func demo3() {
// 仅仅定义了类型,并没有设置数值
let x: Int
// 常量定义完成类型后,可以有`一次`设置机会
x = 10
// 设置之后,不允许再修改
// x = 20
// Constant 'x' used before being initialized
// 常量在使用之前,必须要做初始化
print(x)
// 仅仅定义了类型,并没有设置数值
let x: Int
// 常量定义完成类型后,可以有`一次`设置机会
x = 10
// 设置之后,不允许再修改
// x = 20
// Constant 'x' used before being initialized
// 常量在使用之前,必须要做初始化
print(x)
}
4. 如何选择变量和常量?,只有在需要改变的时候,才应该使用‘var’
如果从来没有变过的变量,Xcode会提示使用 let
例子:letv = UIView()
// 修改了 v 的属性,而没有修改 v 的`地址`
v.backgroundColor= UIColor.redColor()
8.可选项: 表示一个值可以有内容,也可以为 nil
1.定义可选项,最原始的方法, let x: Optional = 10 : Optional<Int>,表示x 要么有整数值,要么为 nil。<Int> 表示泛型
2. 2. 定义可选项,类型?的格式 : let y: Int? :Int? 表示 x 要么有整数值,要么为 nil,`?` 是专门用来定义可选项的,
常量的可选项,没有默认值,
例子:
lety: Int?
y =10
print(y)
print(y)
变量的可选项,默认值是nil
例子:
varz: Int?
z = 100
print(z) // nil
3.注意:
//可选项不能直接参与计算!因为可能有值,也有可能为nil
// 如果要让可选项参与计算,需要`解包unwarp`
// unexpectedly found nil while unwrapping an Optional value
// 翻译:在解包可选项的时候,发现了空值
// `!` 用来解包- 如果出现 nil,会直接崩溃!
// `!` 表示程序猿向编译器承诺,一定有值,如果没有,就崩!
// 如果要让可选项参与计算,需要`解包unwarp`
// unexpectedly found nil while unwrapping an Optional value
// 翻译:在解包可选项的时候,发现了空值
// `!` 用来解包- 如果出现 nil,会直接崩溃!
// `!` 表示程序猿向编译器承诺,一定有值,如果没有,就崩!
// `!` 又叫做强行解包!从可选项中把值取出来,如果没有值,抛出异常
例子: print(x! + y! + z!)
9.控制流
1、基本 if 逻辑
注意的地方: 1. 没有 ()
2. 必须要有 `{}`
3. 没有单条的 if ,一定要使用 {}
`{}` 是用来包装一段代码
4. 很多公司的代码规范中,是不允许不使用 {}
2. 必须要有 `{}`
3. 没有单条的 if ,一定要使用 {}
`{}` 是用来包装一段代码
4. 很多公司的代码规范中,是不允许不使用 {}
5. Swift中没有,非零即真,所有的逻辑条件必须指定true / false
例子:
letx = 10
if x > 5 {
print("大")
} else {
// 编译器自动判断分支结构,无法进入
print("小")
print("大")
} else {
// 编译器自动判断分支结构,无法进入
print("小")
}
2、三目运算
let x = 10
x > 5 ? print("大") : print("小”) // 三目运算符 在Swift 中如果使用得当,能够简化代码
3、 `()` 表示执行,空的执行, 例子: x >6 ? print("大") : ()
4、可选项参与计算前需要解包,在 Swift 中,关于if 语句如果没有写好,可能会非常的丑陋!
例子:
letx: Int? = 10
ifx != nil{
print(x! +10)
print(x! +10)
}
5、 ?? -- (x ?? 0):表示 对于可选项 x,如果有值,使用x 的值, 如果没有值,使用?? 后面的值替代。注意: ?? 的优先级低,为了不必要的麻烦,一定记住使用 ()
6、 if let/var
if let : 作用 :判断(是否为nil) + 设置数值 ,分支内部的 num 是一定有值的,可以避免考虑`!` 的问题, num 的作用域只是在 {} 内部 , 使用频率高,if let 可以同时判断多值,使用,隔开,如果其中有一个值为nil,那就打印不出值来。大括号的作用,标示作用域,否则会穿透的。
letx: Int? = 10
iflet num = x {
// num += 10 let不能修改数值,想要修改数值的话,就用 if var
print(num)
}
if var:如果在分支内部希望修改数值,可以使用if var,
7、guard 守卫,在 Swift 2.0 推出的语法。
//和 if let刚好相反
// guard let是在判断之后的分支有效
// guard let是在判断之后的分支有效
// 如果守护的变量为 nil,直接提示并且返回
例子: var x: Int? =10
var oName:String? ="老二"
var oAge:Int? =19
guardlet num = xelse {
print("x wei nil")
return
}
guardlet name = oNameelse {
print("name wei nil")
return
}
guardlet age = oAgeelse {
print("age wei nil")
return
var oName:String? ="老二"
var oAge:Int? =19
guardlet num = xelse {
print("x wei nil")
return
}
guardlet name = oNameelse {
print("name wei nil")
return
}
guardlet age = oAgeelse {
print("age wei nil")
return
}
//当所有条件都满足之后,开始真正的逻辑处理
//通常下面的代码更复杂,少一层 `{}`的嵌套!
//通常下面的代码更复杂,少一层 `{}`的嵌套!
// 提示:无论从阅读角度,还是编译角度,都需要尽量减少嵌套层次!
print(x)
print(age)
print(name)
print(num)
结果: //Optional(10)
//19
//老二
print(age)
print(name)
print(num)
结果: //Optional(10)
//19
//老二
//1
control +i 自动调整缩进
10、 switch
1.没有 break
2. 不仅仅局限在 int,可以对任何类型的数据进行 switch
3. 每一个 case都必须至少有一条语句,如果实在没有,可以用 break
4. 如果要 switch多值,使用 ,分隔
5. case 要涵盖所有的可能,如果不能列举,需要使用 default
穿透
2. 不仅仅局限在 int,可以对任何类型的数据进行 switch
3. 每一个 case都必须至少有一条语句,如果实在没有,可以用 break
4. 如果要 switch多值,使用 ,分隔
5. case 要涵盖所有的可能,如果不能列举,需要使用 default
穿透
func demo() {
let x =“9”、9、9.9
switch x {
case"10","9":print("优")
let x =“9”、9、9.9
switch x {
case"10","9":print("优")
case"8":print("良")
case “7":break
default:print("一般")
}
}
}
11、for 循环
1.for变量 in范围 { //代码实现 },0..<5表示 0~4的范围。注意:`..<`和 `...`用于定义 `Range`类型,左右都不要添加空格
例子: for i in0..<5 {
print(i) 01234
print(i) 01234
}
// 0...5表示 0~5的范围
for iin0...5 {
print(i)
for iin0...5 {
print(i)
}
2.Range<Int>表示一个整数的范围 :起始值..<结束值
例子:let range1 =0..<5
print(range1) 答案:0..<5
let range2 =0...5
print(range2)答案: 0..<6
3.传统的 for
没有 ()
i是一个 var,循环过程中,增长
提示:Swift 3.0中,i++将被取消
i++ / ++i
num = i++
等效代码
temp = i + 1
num = i
i = temp
num = ++i
等效代码
i = i + 1
num = i
i++ / ++i
num = i++
等效代码
temp = i + 1
num = i
i = temp
num = ++i
等效代码
i = i + 1
num = i
例子: forvar i = 0; i <10; i +=1 {
print(i)
print(i)
}
11、字符串
Swift String,是一个结构体,量级更轻,效率略高,推荐使用,可以支持遍历
1.oc的NSString不支持遍历的 swift的String支持遍历。
let string:String ="飞的更高"
// 遍历字符串
for cin string.characters {
print(c)
// 遍历字符串
for cin string.characters {
print(c)
}
2.字符串拼接
let name ="zhangsan"
let age =18
let point =self.view.center
// 格式 "\(变量/常量名)"
//告别了 -> NSStringStringWithCGPoint
let age =18
let point =self.view.center
// 格式 "\(变量/常量名)"
//告别了 -> NSStringStringWithCGPoint
print("\(name) ~~~ \(age)\(point)")
3.字符串的长度:将字符串转换成对应编码 UTF8字节的长度,一个中文对应的 UTF8编码占 3个字节, UTF8的字符,占用字节数为 1~4个,
例子:
let name ="hello world你好世界"
print(name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) 23
//获得字符串中字符的个数
print(name.characters.count) 15
// as是类型转换 => OC (CZDemoCell *)UITableViewCell 转换成 NSString类型
let ocName = nameasNSString
let ocName = nameasNSString
print(ocName.length) 15
4. 格式化字符串
let h =8
let m =5
let s =6
let m =5
let s =6
let dateStrig = "\(h):\(m):\(s)"
print(dateStrig) 8:5:6
// 使用数组生成格式字符串
// String(format: <#T##String#>, arguments: <#T##[CVarArgType]#>)
方式一: let dateString1 =String(format:"%02d:%02d:%02d", arguments: [h, m, s])
print(dateString1) 08:05:06
// String(format: <#T##String#>, <#T##arguments: CVarArgType...##CVarArgType#>)
方式二:let dateString2 =String(format:"%02d:%02d:%02d", h, m, s)
print(dateString2) 08:05:06
5.子串 -方便的方法,转换成 NSString
例子: let str ="我们一起去飞"
// 1. 方法1,使用 NSString
let subStr1 = (strasNSString).substringWithRange(NSMakeRange(2,4))
print(subStr1)
// 2. 方法2,Swift的语法
// startIndex是字符串的起始索引位置 -> 0
// endIndex是字符串的结束的索引位置 -> count
// advancedBy是将索引递进的函数
// n > 0向右递进 n个字符
// n < 0向左递进 n个字符
let subStr2 = str.substringFromIndex(str.startIndex.advancedBy(2))
print(subStr2)
// can not increment endIndex,不允许递增 endIndex,会出现越界
let subStr3 = str.substringToIndex(str.endIndex.advancedBy(-2))
print(subStr3)
// 从 Xcode 7 beta 5开始就固定了格式了
let startIndex = str.startIndex//.advancedBy(2)
let endIndex = str.endIndex//.advancedBy(-2)
print(startIndex)
print(endIndex)
// 提示如果范围越界,会崩溃 str.substringWithRange(aRange: Range<Index>)类型
let subStr4 = str.substringWithRange(startIndex..<endIndex)
print(subStr4)
12.集合(数组和字典)
A:数组:
1.定义一个空的数组: let array =[String]():[String] -> 表示存放字符串的数组,根据右侧的内容自动推导数组中的元素类型,
例子: let array = ["zhang","wang","li"]
[Int],Swift中基本数据类型不需要包装,Int是一个结构体 let array1 = [1,2,3,4,5]
[NSObject](继承自 NSObject 的子类) ->
// [AnyObject],在 Swift中使用的更多,任意对象
// Swift中允许对象没有任何父类
//如果数组中的元素类型不一致,会推导出 [NSObject]类型
// Swift中允许对象没有任何父类
//如果数组中的元素类型不一致,会推导出 [NSObject]类型
let array2 = [1,"zhang"]
print(array)
2.遍历数组
let array = ["zhang","wang","li"]
// 1. 直接按照下标遍历
for iin0..<array.count {
print(array[i])
}
// 2. for in
// s的类型取决于数组的类型
for sin array {
print(s)
}
// 3. 遍历内容和下标
for ein array.enumerate() {
print("\(e.index)\(e.element)")
}
print("----")
// 4. 示例代码
// n就是索引,s就是字符串
// n和 s的名字可以随便写
for (n, s)in array.enumerate() {
print("\(n)\(s)")
}
print("----")
// 5. 倒序遍历数组
for sin array.reverse() {
print(s)
}
// 6. 倒序下标遍历
for ein array.reverse().enumerate() {
print(e)
print("\(e.index)\(e.element)")
// 1. 直接按照下标遍历
for iin0..<array.count {
print(array[i])
}
// 2. for in
// s的类型取决于数组的类型
for sin array {
print(s)
}
// 3. 遍历内容和下标
for ein array.enumerate() {
print("\(e.index)\(e.element)")
}
print("----")
// 4. 示例代码
// n就是索引,s就是字符串
// n和 s的名字可以随便写
for (n, s)in array.enumerate() {
print("\(n)\(s)")
}
print("----")
// 5. 倒序遍历数组
for sin array.reverse() {
print(s)
}
// 6. 倒序下标遍历
for ein array.reverse().enumerate() {
print(e)
print("\(e.index)\(e.element)")
}
3.增删改 ->可变 NSMutableArray -- var /不可变 NSArray -- let
var array = ["zhang","wang","li"]
// 添加内容 addObject
array.append("小花")
print(array)
// 以下代码有问题吗?
// Cannot convert value of type 'Int' to expected argument type 'String'
//不能向数组中追加不允许的类型
// array.append(180)
// 修改
// 添加内容 addObject
array.append("小花")
print(array)
// 以下代码有问题吗?
// Cannot convert value of type 'Int' to expected argument type 'String'
//不能向数组中追加不允许的类型
// array.append(180)
// 修改
array[0] ="老王"
print(array)
// 删除全部
array.removeAll()
print(array)
4.演示数组的容量
///定义类型,没有初始化,如果定义一个空的数组
// var array: [String]
// // 实例化一个空的字符串数组
// array = [String]()
//以上两句代码也可以合并成一条语句
var array = [Int]()
print(array.capacity)0
// 关于容量:数组的初始容量默认是0
//在添加元素的时候,如果超出当前容量范围,在当前容量范围基础上 * 2
for iin0..<9 {
array.append(i)
// var array: [String]
// // 实例化一个空的字符串数组
// array = [String]()
//以上两句代码也可以合并成一条语句
var array = [Int]()
print(array.capacity)0
// 关于容量:数组的初始容量默认是0
//在添加元素的时候,如果超出当前容量范围,在当前容量范围基础上 * 2
for iin0..<9 {
array.append(i)
print("\(array) --容量 :\(array.capacity)”) 16
}
5.合并数组
var a1 = [1,2,3]
let a2 = [4,5,6]
// 目标,将 a2合并到 a1中
a1 += a2
let a2 = [4,5,6]
// 目标,将 a2合并到 a1中
a1 += a2
print(a1)
B:字典
1.字典的定义:OC中使用 {} Swift中还是 [], 类型: [String : NSObject] / [String : AnyObject]在 Swift开发中,非常普遍
- Top level object is an NSArray or NSDictionary
顶级节点是 NSArray或者 NSDictionary
- All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
所有对象必须是 NSString, NSNumber, NSNull
字典和数组中只能包含以上三种类型的值
- All dictionary keys are NSStrings
所有字典的 key都必须是 NSString
- NSNumbers are not NaN or infinity
数值不能为空或者无穷大 (infinity)
例子: let dict = ["name":"zhang","age":18]
print(dict)
2.字典的遍历
let dict = ["name":"zhang","age":18]
// 0 是 key
// 1是 value
//语义不直观
for ein dict {
print("\(e.0),\(e.1)")
}
// 0 是 key
// 1是 value
//语义不直观
for ein dict {
print("\(e.0),\(e.1)")
}
前面的参数 key是 KEY
后面的参数 value 是值
for (key, value)in dict {
print("\(key)\(value)")
}
3.增删改,可变 var,不可变 let
//字典中的 key是通过 hash哈希值来取值的-在字典中 key 是唯一的
var dict = ["name":"zhang","age":18]
// 添加值 -如果 key不存在,新建值对
dict["title"] ="boss"
print(dict)
// 修改值 -如果 key存在,覆盖原有值对
dict["name"] ="老王"
print(dict)
// 删除
dict.removeValueForKey("age")
print(dict)
// 还有一种删除方法
dict["name"] =nil
var dict = ["name":"zhang","age":18]
// 添加值 -如果 key不存在,新建值对
dict["title"] ="boss"
print(dict)
// 修改值 -如果 key存在,覆盖原有值对
dict["name"] ="老王"
print(dict)
// 删除
dict.removeValueForKey("age")
print(dict)
// 还有一种删除方法
dict["name"] =nil
print(dict)
4.拼接
var dict1 = ["name":"zhang","age":18]
let dict2 = ["title":"boss","name":"老王","height":1.3]
// 目标,将 dict2的内容合并到 dict1中
// dict1 += dict2
//遍历字典2,依次设置数值
//遵守 key唯一的原则,如果有,覆盖 /如果没有新建
for (k, v)in dict2 {
dict1[k] = v
}
let dict2 = ["title":"boss","name":"老王","height":1.3]
// 目标,将 dict2的内容合并到 dict1中
// dict1 += dict2
//遍历字典2,依次设置数值
//遵守 key唯一的原则,如果有,覆盖 /如果没有新建
for (k, v)in dict2 {
dict1[k] = v
}
print(dict1)