一 . 开发中 推荐使用 let 因为let 更加安全,等需要修改的时候,再改成var
let: 表示常量 一经赋值 就不能被修改,不可变
var: 表示变量 可变
在swift 中 数据的类型就是自动推导 根据 ‘=‘ 右边 来确定数据的具体类型
swift 是一个类型校验 非常严格的语言
整数默认类型是 Int long
小数的默认类型 是 Double 双精度 CGFloat 单精度
不同类型的数据,无法直接进行计算 不支持隐含形式转换
代码:
func
demo() {
let a = 10
// a = 20
var b: CGFloat = 20.5
b = 10.5
let c = CGFloat(a) + b
print(c)
let a = 10
// a = 20
var b: CGFloat = 20.5
b = 10.5
let c = CGFloat(a) + b
print(c)
}
二 . Switch 分支结构
1. break 可以省略(没有贯穿的问题)
2. case的每一条件 必须至少有一段可以执行的代码
3. 在case中,定义变量, 不需要加{} (OC必须加)
4. case的类型 可以是任意类型 (OC只能是整数类型)
5.可以同时case 多个条件
代码:
func
demo6() {
let i = "16000"
switch i {
case "18000" ,"16000":
let str = "出任ceo"
print("高级工程师")
case "12000":
print("中级工程师")
case "8000":
print("初级g工程师")
default:
print("码农")
}
let i = "16000"
switch i {
case "18000" ,"16000":
let str = "出任ceo"
print("高级工程师")
case "12000":
print("中级工程师")
case "8000":
print("初级g工程师")
default:
print("码农")
}
}
三.??
?? 快速判断是否为空,并且 设置为空默认值
实际运用 在获取数据源的个数 用的非常多
所有可选项 都不能直接参与运算
运算符优先级 低
func demo5() {
// var a: Int? = 10
//
// print((a ?? -1) + 20)
// var a: Int? = 10
//
// print((a ?? -1) + 20)
// }
四.guard let… else 守卫
func
demo4() {
let ulstring =
"http://www.douniwan.com
guard
let url =
NSURL(string: ulstring)
else {
//程序走到这里说明url肯定是没有值的 guard 里面的代码肯定没有值才能进来的
return
}
//程序走到这里 url 一定有值
print(url)
return
}
//程序走到这里 url 一定有值
print(url)
}
五. if let 表示 赋值 并且判断是否为空
func
demo3() {
//1. urlString
let ulstring = "http://www.douniwan.com?type"
//2.url
// let url = NSURL(string: ulstring)
//// print(url)
// //request
// if url != nil {
// let request = NSURLRequest(URL: url!)
// print(request)
// }
if let url = NSURL(string: ulstring) {
//程序能够走到这个分支 就表示 url一定有值
let request = NSURLRequest(URL: url)
}
//4.网络请求
//1. urlString
let ulstring = "http://www.douniwan.com?type"
//2.url
// let url = NSURL(string: ulstring)
//// print(url)
// //request
// if url != nil {
// let request = NSURLRequest(URL: url!)
// print(request)
// }
if let url = NSURL(string: ulstring) {
//程序能够走到这个分支 就表示 url一定有值
let request = NSURLRequest(URL: url)
}
//4.网络请求
}
六. 分支结构
1. if 条件: 没有()
2. {} 不能省略
3. 在swift 中没有 ,没有非零既真的概念
只有 true /false
以后再也不不用担心! 忘写了
代码:
func
demo2() {
let i = 10
if i > 0 {
print("大于0")
} else {
print("小于0")
}
let i = 10
if i > 0 {
print("大于0")
} else {
print("小于0")
}
}
七.可选项 ?
?: 可选类型 有吗? 有值 就是具体类型的值,没有值 是nil
打印可选项 会带上 optaional
!: 有 !!!
fatal(致命的)
error: unexpectedly found nil while unwrapping(强制解包) an
Optional value
使用强制解包的时候 可能会有风险
func
demo1() {
var a:
Int?
//每使用
'!'都需要思考
这样
安全吗
if (a != nil) {
print(a!)
}
if (a != nil) {
print(a!)
}
}
八.NSString 继承 NSObject 效率低 不支持遍历
swift: string 是结构体 更加效率高效, 支持遍历
代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
demo2()
}
//字符串的拼接
func demo2() {
let str1 = "你若安好"
let str2 = "便是晴天"
let str = str1 + str2
// print(str)
//另外一种拼接方式 \() 转译字符串
let i:Int? = 10
print("\(i)\(str2)")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
//定义字符串
func demo1() {
let str: String = "良辰必有重谢"
for s in str.characters {
print(s)
}
//字符串的长度
//lengthOfBytesUsingEncoding 取 字符编码的长度 中文字符编码长度 = 3
let l = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
print(l)
let l1 = str.characters.count
print(l1)
}
}
九.截取字符串
//字符串和range
截取子串
func demo4() {
//将 String 转换成 NSString 再去截取子串
let str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
//as 转换类型
let substr = (str as NSString).substringFromIndex(1)//截取的是从第一个开始的全部字
let subset = (str as NSString).substringWithRange(NSMakeRange(0, 1))//第一个参数代表的是位置,,第二个参数代表的是长度进行截取
let subStr = (str as NSString).substringToIndex(1)//截取的是字
print(subStr)
func demo4() {
//将 String 转换成 NSString 再去截取子串
let str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
//as 转换类型
let substr = (str as NSString).substringFromIndex(1)//截取的是从第一个开始的全部字
let subset = (str as NSString).substringWithRange(NSMakeRange(0, 1))//第一个参数代表的是位置,,第二个参数代表的是长度进行截取
let subStr = (str as NSString).substringToIndex(1)//截取的是字
print(subStr)
}
十.字符串的比较
//字符串的比较
func demo3() {
let str = "你还是把地扫了"
let str1 = "叶良成"
if str == str1 {
print("血雨腥风")
} else {
print("算了")
}
func demo3() {
let str = "你还是把地扫了"
let str1 = "叶良成"
if str == str1 {
print("血雨腥风")
} else {
print("算了")
}
}
十一.字符串拼接
//字符串的拼接
func demo2() {
let str1 = "你若安好"
let str2 = "便是晴天"
let str = str1 + str2
// print(str)
//另外一种拼接方式 \() 转译字符串
let i:Int? = 10
print("\(i)便是晴天")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
func demo2() {
let str1 = "你若安好"
let str2 = "便是晴天"
let str = str1 + str2
// print(str)
//另外一种拼接方式 \() 转译字符串
let i:Int? = 10
print("\(i)便是晴天")
//NSString stringWithFormat:@"%@%@" ,"忘了他吧"
}
十二.数组的定义以及数组的拼接
//数组的拼接
func demo1() {
let arr1 = ["范冰冰","李冰冰"]
let arr2 = ["凤姐","刘亦菲"]
let arr = arr1 + arr2
// print("\(arr1)\(arr2)")
print(arr)
func demo1() {
let arr1 = ["范冰冰","李冰冰"]
let arr2 = ["凤姐","刘亦菲"]
let arr = arr1 + arr2
// print("\(arr1)\(arr2)")
print(arr)
}
十三.数组的遍历,,增加,删除,
//数组中不建议存放类型不行同的对象
var arr = ["范冰冰","李冰冰","凤姐"]
//数组的遍历
for str in arr {
print(str)
}
//向数组中添加元素
arr.append("刘亦菲")
print(arr)
//修改元素
arr[0] = "章子怡"
var arr = ["范冰冰","李冰冰","凤姐"]
//数组的遍历
for str in arr {
print(str)
}
//向数组中添加元素
arr.append("刘亦菲")
print(arr)
//修改元素
arr[0] = "章子怡"
十四.字典的遍历,增加,删除,修改
//字典的定义
func demo() {
var dict = ["name":"李冰冰","age":30]
//增加键值对
dict["title"] = "女神"
//根据key 修改value
dict["name"] = "林志玲"
//删除
dict.removeValueForKey("age")
print(dict)
//字典的遍历
//(key,value)
for (a, b) in dict {
print("key = \(a)")
print("value = \(b)")
}
func demo() {
var dict = ["name":"李冰冰","age":30]
//增加键值对
dict["title"] = "女神"
//根据key 修改value
dict["name"] = "林志玲"
//删除
dict.removeValueForKey("age")
print(dict)
//字典的遍历
//(key,value)
for (a, b) in dict {
print("key = \(a)")
print("value = \(b)")
}
}
//数组的删除
arr.removeFirst()//删除第一个
arr.removeLast()//删除最后一个
arr.removeFirst()//删除第一个
arr.removeLast()//删除最后一个
// arr.removeAll()//删除全部
十五.函数的定义,以及调用
//调用
//第一个参数名 可以被省略
let result = sum(10, b: 100)
print(result)
let result1 = area(height: 10, width: 20)
print(result1)
demo("哈哈")
demo1("嘻嘻")
demo2("呵呵")
}
//函数的基本格式
// func 函数名(参数名: 参数类型) -> 返回值类型
func sum(a: Int, b: Int) -> Int {
return a + b
}
//函数没有返回值的三种写法
//第一种写法 Void
func demo(str: String) -> Void {
print(str)
}
// 2.()
func demo1(str: String) -> () {
print(str)
}
//3. 什么都没有
func demo2(str: String) {
print(str)
}
//函数的外部参数
//1.能够让外界调用 对函数的语义更加清晰
//2.在函数内部 使用 更加简洁
func area(height a: Int, width b: Int) -> Int {
return a * b
}
什么时候会出现block 和 swift的闭包的循环引用
只有在block内部的属性对外部的block进行了一次self的保存,这时候就应该考虑循环引用了
解决方法有:
block的解决方法
1. __weak
typeof(self)
weakSelf =
self;
让一方进行weak
2. __unsafe_unretained typeof(self) weakSelf = self
闭包的解决方法:
一.
//(data) -> ()
闭包的定义 in(闭包的定义
和
执行代码的间隔 )
可执行代码
//第二种解决循环引用的方法
//unowned self 对象被回收时 不会自动指向 nil 会有风险 坏地址访问 野指针
//assgin 作用是一样的 -> unsafe_unretained
loadData {[unowned self] (data) -> () in
print(data)
//第二种解决循环引用的方法
//unowned self 对象被回收时 不会自动指向 nil 会有风险 坏地址访问 野指针
//assgin 作用是一样的 -> unsafe_unretained
loadData {[unowned self] (data) -> () in
print(data)
//使用
?
如果是nil
就不会做任何操作
print(self.view)
}
二.
func method1() {
//swfit 解决循环引用
//weak 有一个机会 会指向 nil
//[weak self] 表示闭包中访问所有的 self 都是弱引用的
//weak 作用是一样的 ->__weak
loadData {[weak self] (data) -> () in
print(data)
//使用 ? 如果是nil 就不会做任何操作
print(self?.view)
}
//swfit 解决循环引用
//weak 有一个机会 会指向 nil
//[weak self] 表示闭包中访问所有的 self 都是弱引用的
//weak 作用是一样的 ->__weak
loadData {[weak self] (data) -> () in
print(data)
//使用 ? 如果是nil 就不会做任何操作
print(self?.view)
}
}
func methodOC() {
//(data) -> () 闭包的定义 in(闭包的定义 和 执行代码的间隔 ) 可执行代码
//OC的解决办法 定义weak self类型
//weak 有一个机会 会指向 nil
weak var weakSelf = self
loadData { (data) -> () in
print(data)
//使用 ? 如果是nil 就不会做任何操作
print(weakSelf?.view)
}
}
闭包:
()->()
(闭包的参数)->(闭包的类型)可执行的代码