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
}

可选项

/*
?:可选项 有吗 有值 就是具体类型的值 没有值 是nil
打印可选项 会带上optaional 
!:有!!!

*/

func demo1(){
    var a: Int? =10

    print(a)
}

分支结构

/*
条件:没有()
2.{}不能被省略
在swift 中没有 非零既真的概念
只有true 和 false
*/
func demo2(){
    let i = 10
    if i > 0 {
        print("大于0")
    } 
}

//if的实际运用
//1.if let 表示 赋值 并且判断是否为空
func demo3(){
    //1.urldtring
    let urlstring = "http:www.baidu.com"
    //2.url
    if let url = NSURL(string: urlstring){
    //程序能够走到这个分支 就表示 url 一定有值
    let request = NSURLRequest(URL:url)
    }
}

循环

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        demo4()
    }


    // _ 表示 忽略
    func demo4() {
        for _ in 0..<10 {
            print("hello world")
        }
    }


    //2.循环
    // 0...10  0~10 包含结尾
    func demo3() {
        for i in 0...10 {
            print(i)
        }
    }

    //swift循环
    // 0..<10  0~ 9
    func demo2() {
        for i in 0..<10 {
            print(i)
        }
    }


    //仿OC循环  循环的条件   可以省略 ()

    //递增的变量 不能使用 let
    func demo1() {
        for var i = 0; i<10; i++ {
            print(i)

        }
    }

}

字符串

import UIKit

/*
OC : NSString 继承 NSObject  效率略低  不支持遍历
swift: String  是结构体  更加高效  支持遍历
*/

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        demo4()
    }


    //字符串和range 截取子串
    func demo4() {
        //将 String 转换成 NSString 再去截取子串

        let str = "听说下雨天,美女,炸鸡,啤酒更加配哦"
        //as 转换类型
        let subStr = (str as NSString).substringWithRange(NSMakeRange(6, 2))
        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 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)
    }

}

数组


import UIKit

/*
swift数组  [元素]

let: 不可变数组
var: 可变数组
*/

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        demo1()
    }

    //数组的拼接
    func demo1() {
        let arr1 = ["范冰冰","李冰冰"]
        let arr2 = ["凤姐","刘亦菲"]
        let arr = arr1 + arr2
        print(arr)
    }

    func demo() {

        //数组中不建议存放类型不行同的对象
        var arr = ["范冰冰","李冰冰","凤姐"]

        //数组的遍历
        for str in arr {
            print(str)
        }

        //向数组中添加元素
        arr.append("刘亦菲")
        print(arr)

        //修改元素
        arr[0] = "章子怡"




        //数组的删除
        arr.removeFirst()

        arr.removeLast()

//        arr.removeAll()


        print(arr)
    }

字典

import UIKit
//OC {}

//swift  [key : value] 键值对
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        demo()

    }

    //字典的定义
    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)")
        }
    }
}

函数

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //调用
        //第一个参数名 可以被省略
        let result = sum(10, b: 100)
        print(result)

        let result1 = area(height: 10, width: 20)
        print(result1)

        demo("哈哈")
        demo1("嘻嘻")
        demo2("呵呵")
    }


    //函数没有返回值的三种写法
    //第一种写法  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
    }

    //函数的基本格式
    // func 函数名(参数名: 参数类型) -> 返回值类型
    func sum(a: Int, b: Int) -> Int {
        return a + b
    }

}

闭包

/*
1.提前准备好的一段可以执行的代码 
2.可以当做参数传递
3.在需要的时候 执行闭包
4.在闭包中 访问 self  可能会出现循环引用
*/

import UIKit

class ViewController: UIViewController {

    //在swift中定义属性
//    var finishedCallBack: () -> ()?
    //属性 默认就是强引用
    var finishedCallBack: ((data: String) -> ())?
    override func viewDidLoad() {
        super.viewDidLoad()

        //(data) -> () 闭包的定义  in(闭包的定义 和 执行代码的间隔  )  可执行代码

        //第二种解决循环引用的方法
        //unowned self  对象被回收时  不会自动指向 nil  会有风险  坏地址访问  野指针
        //assgin 作用是一样的  -> unsafe_unretained
        loadData {[unowned self] (data) -> () in
            print(data)

            //使用 ? 如果是nil  就不会做任何操作
            print(self.view)
        }


        //调用 
        loadData10 {

        }
    }



    func loadData10(finished: () -> ()){

    }


    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)
        }
    }

    //() -> () 没有参数没有返回值的闭包
    // (闭包的参数) -> 闭包的返回值
    func loadData(finished: (data: String) -> () ) {
        //开始异步加载数据

        //记录参数闭包
        finishedCallBack = finished
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            //
            print("开始网络耗时操作")

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //执行回调
                //闭包是外部传递过来的  self 明确调用的上下文
                self.working()

                print("哈哈哈哈")
            })
        }

        // 闭包的简写
        //当函数的最后一个参数 是闭包  可以将闭包简化为 '尾' 随闭包
        dispatch_async(dispatch_get_global_queue(0, 0) ,{ () -> Void in

        })
    }


    func working() {
        finishedCallBack?(data: "加载数据成功")
    }


    //析构函数 
    deinit {
        print("VC 88")
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值