Swift笔记

 一 . 开发中 推荐使用 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)
    }

 二 . 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("码农")
        }
       
    }

三.??
 ?? 快速判断是否为空,并且 设置为空默认值
 实际运用 在获取数据源的个数 用的非常多
 所有可选项 都不能直接参与运算
 运算符优先级 低
func demo5() {
//        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)
       
    }

五. 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. if 条件: 没有()
2. {} 不能省略
3. 在swift 中没有 ,没有非零既真的概念

只有 true /false 
以后再也不不用担心! 忘写了
代码:
 func demo2() {
       
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!)
        }
       
    }

八.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 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 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] = "章子怡"
       
  十四.字典的遍历,增加,删除,修改
    // 字典的定义
    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.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)
           
            //使用 ? 如果是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 )
        }
    }
   
   
func methodOC() {
       
//(data) -> () 闭包的定义  in(闭包的定义 执行代码的间隔  )  可执行代码
       
       
//OC的解决办法 定义weak self类型
        //weak 有一个机会 会指向 nil
        weak var weakSelf = self
       
loadData { (data) -> () in
           
print(data)
           
           
//使用 ? 如果是nil  就不会做任何操作
            print(weakSelf?.view)
        }
    }
    

闭包:


()->()
(闭包的参数)->(闭包的类型)可执行的代码














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值