• Swift


    1.Swift项目与OC项目的区别

     - Swift的类文件是以 .swift 结尾

     - main.m 不见了,程序入口以 `@UIApplicationMain`

     - Swift中,代码都是写到 `{}` 标识的代码块里面

     - 在 Swift 中,每一行代码的末尾不用跟上 `;`

     - OC 中的 initWithXXX 换成 `类名(XXX:__)` [init(XXX:)]

     - Swift 中使用 `点 .` 的方式去调用方法

     - Swift 枚举分为 `大类型.小类型`,而且大类型可以省略

     - Swift 中,当前类的属性或者方法都可以不用 self. 开头,建议大家不要加.因为在后面闭包的使用的时候,闭包里面会使用 self

     - Selector: 两种表现形式 Selector("buttonClick") / 在要传入 Selector 的地方 直接填写 "buttonClick"

     - 在 Swift 中使用 print 作打印语句

    2.常量和变量

    - 使用 `let` 定义常量

    - 使用 `var` 定义变量

    - 在 Swift 中,有 `自动推导`,会根据等号后面的值,推断出前面变量(常量)的类型,也就是说,可以不用显式的去指定类型

    - 在 Swift 中对类型检测非常严格,没有 `隐式转换`,只有类型相同的变量(常量)才能进行运算

    - option + click 查看变量(常量)类型

    - let 与 var 如何选择: 先使用 let 定义,如果需要更改的话,再变成 var

    3.可选类型

            - fatal error: unexpectedly found nil while unwrapping an Optional value

            - 什么是可选类型: 一个变量(常量)可能有值,可能为nil,那么它就是一个可选类型

            - 可选类型的变量不能直接进行运算 ,要强制解包(使用 !) 或者判断其是否有值再计算

            - 使用 `?` 标识变量是一个可选类型的变量

            - 输出的时候如果发现 `Optional(xxx)` 字样,代表打印的变量是一个可选类型

            - `!` 用于标识可选类型的变量一定有值 [解包] (程序员向系统保证 ,a 里面一定有值,你去取a的值去计算,如果没有取到值,系统就会崩溃)

            - 我们在使用 `!` 的时候,一定要小心,要确保其修饰的变量一定有值,

            - `??` 空合并运算符,判断其前面的可选值是否真的有值,如果有,就直接返回该值,如果为nil,就使用 其后面的值进行运算

    4.if语句

        - 条件语句可以不使用 `()` 圆括号括起来

            - `{}` 执行代码块的花括号不能省略

            - 在 Swift 中是没有`非0即真`概念,条件语句只能有 true/false

            let a = 10
            
            // 判断 a 是否大于5, 如果大于5,就打印一句话
            if a > 5 {
                print("a 大于 5")
            }   
            // 方式1
            // 运算符的左右空格一定要对称 (空格大法)
            if url != nil{
                let request = NSURLRequest(URL: url!)
                print(request)
                // 如果下面有很多代码,并且多次使用 url ,都需要强行解包
            }
            
            // 方式2: 使用 if let
            // if let 会判断 url 是否有值,如果没有值,什么都不错
            // 如果有值,会把 url 的值取出来赋值给 u,并且进入到 if 的执行代码块中
            if let u = url {
                let request = NSURLRequest(URL: u)
                print(request)
            }    

    if let 与 guard let

        func demo6(){
    //        let url = NSURL(string: "http://www.baidu.com")
    //        
    //        if let u = url {
    //            let request = NSURLRequest(URL: u)
    //            print(request)
    //            // 写很多逻辑
    //        }
            
            let url = NSURL(string: "http://www.qq.com")
            guard let u = url where u.host == "www.baidu.com" else {
                print("url为空或者不符合条件")
                return
            }
            let request = NSURLRequest(URL: u)
            print(request)
            
        }

    5.switch

    let scoreStr = ""
            switch scoreStr {
            case "":
                print("大于等于90小于等于100")
            case "":
                print("大于等于80小于90")
            case "":
                print("大于等于60小于80")
            case "":
                print("大于等于0小于60")
            default:
                print("其他")
            }
            
            // 判断一个范围
            let score = 95
            switch score {
            case _ where score >= 90 && score <= 100:
                print("")
            case let s where s < 90 && s >= 80:
                print("")
            case let s where s < 80 && s >= 60:
                print("")
            case let s where s < 60:
                print("")
            default:
                print("其他")
            }

    6.循环

            // 方式1: 仿照oc写
    //        for (int i=0; i<3; i++) {
    //            NSLog(@"哈哈");
    //        }
            for var i = 0; i < 3; i++ {
                print(i)
            }
            
            print("==========")
            // 方式2: for in
            for i in 0..<3 {
                print(i)
            }
            
            print("==========")
            for i in 0...3 {
                print(i)
            }
            
            
            print("==========")
            
            // 方式3: 只需要遍历的次数,不需要当前遍历到哪个位
            
            for _ in 0..<3 {
                print("哈哈")
            }
    //        var i = 10
    //        while i > 0 {
    //            i--
    //            print(i)
    //        }
            
            
            var i = 10
            // do while 在 Swift 2.0 Xcode 7.0 beta5 
            // 改成repeat while
            repeat {
                i--
                print(i)
            }while (i > 0)

    7.字符串

        /// 字符串的截取
        func demo4(){
            
            let str = "听说下雨天音乐和辣条更配哟"
            
            // 截取: 下雨天音乐和辣条更配哟
            let r1 = str.substringFromIndex(str.startIndex.advancedBy(2))
            print(r1)
            
            // 截取: 听说下雨天音乐和辣条更
            let r2 = str.substringToIndex(str.endIndex.advancedBy(-2))
            print(r2)
            
            
            // 截取: 下雨天音乐和辣条更
            let startIndex = str.startIndex.advancedBy(2)
            let endIndex = str.endIndex.advancedBy(-2)
            let r3 = str.substringWithRange(startIndex..<endIndex)
            print(r3)
            
            
            // 如果以上的代码不会写,可以把 String 转成 NSString 进行截取
            let range = NSMakeRange(2, str.characters.count - 4)
            let r4 = (str as NSString).substringWithRange(range)
            print(r4)
            
        }
        
        /// 字符串的拼接
        func demo3(){
            
            let name = "老王"
            let age = 18
            // 打印出:我叫老王年龄18
            
            
            // 方式1: 使用 `+`
            let r1 = "我叫" + name + "年龄" + String(age)
            print(r1)
            
            // 方式2: 使用 `(_常量或者变量名_)`
            let r2 = "我叫(name)年龄(age)"
            print(r2)
            
            
            // 使用 formatter 的情况
            
            let h = 9
            let m = 10
            let s = 3
            
            // 输出 09:10:03
            
            let r3 = String(format: "%02d:%02d:%02d", h, m, s)
            print(r3)
            
            let r4 = String(format: "%02d:%02d:%02d", arguments: [h, m, s])
            print(r4)
            
        }
        
        /// 字符串的长度获取
        func demo2(){
            let str = "别哭泣,老王会笑"
            // 获取字符串的长度
            print(str.characters.count)
            print(str.utf8.count)
            print(str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        }
    
    
        /// 字符串的遍历
        func demo1(){
            let str = "别低头,绿帽会掉"
            for value in str.characters {
                print(value)
            }
        }
    View Code

    8.集合

    // 合并字典
        func demo7(){
            var dict1 = ["name": "老王", "age": 18]
            let dict2 = ["no": "哈哈", "height": 180, "name": "老李"]
            
            for (k,v) in dict2 {
                dict1[k] = v
            }
            print(dict1)
        }
        
        
        /// 遍历字典
        func demo6(){
            let dict = ["name": "老王", "age": 18]
            for (k,v) in dict {
                print("key:(k);value:(v)")
            }
        }
        
        /// 字典的定义以及初始化
        /**
            - 使用 let 定义不可变的字典,使用 var 定义可变的字典
        */
        func demo5(){
            // 类型: [String : NSObject]
    //        let dict1 = ["name": "老王", "age": 18]
    //        print(dict1)
            
            // 初始化一个空字典
            var dict2 = [String : NSObject]()
            dict2["name"] = "老王"
            dict2["age"] = 18
            print(dict2)
            
            // 这种方式赋值的话,如果字典里面存对应key的键值对的话,会覆盖掉原来的值
            dict2["name"] = "老李"
            print(dict2)
            
    //        // 取值
    //        let r1 = dict2["name"]
    //        print(r1)
            
            // 移除值
            dict2["name"] = nil
            print(dict2)
        }
        
        // 数组的容量,容量就代表数组能够装多少元素
        func demo4(){
            
            var array = [Int]()
            for i in 0..<128 {
                array.append(i)
                // 打印array的容量
                print("当前count:(array.count),容量是:(array.capacity)")
            }
        }
        
        // 数组的合并
        func demo3(){
            var array1 = ["老王", "老张"]
            let array2 = ["老李", "小尹"]
            
            array1 += array2
            print(array1)
            
    //        let result = array2 + array1
    //        print(result)
        }
        
        // 数组的遍历
        func demo2(){
            let array = ["老王", "老张", "老李"]
            
            // 方式1:
            for var i = 0; i < array.count; i++ {
                print(array[i])
            }
            
            print("============")
            // 方式2: for in
            
            for value in array {
                print(value)
            }
            
            // 方式3:
            for (index, value) in array.enumerate() {
                print("index=(index);value=(value)")
            }
        }
    
        /// 数组的定义,初始化
        /**
            - 使用 let 定义不可变数组,使用 var 定义可变数组
    
        */
        func demo1(){
            
    //        var a = ["老王", 10]
    //        a.append(NSValue(CGRect: CGRectZero))
            
    //        var a = [CGRectZero, CGRect(x: 0, y: 0,  10, height: 10)]
    //         a.append(CGRectZero)
            
            
            // 定义一个数组
            let array1 = ["老王", "老李", "老张"]
            
            print(array1)
            // 定义一个空数组
            var array2: [Int] = [Int]()
            // 添加元素
            array2.append(1)
            array2.append(2)
            array2.append(3)
            print(array2)
            
            // 数组取值
            print(array2[0])
            
            // 移除值
            array2.removeFirst()
            print(array2)
        }
    View Code

    9.函数

     override func viewDidLoad() {
            super.viewDidLoad()
            // demo1()
            // sum1(10, b: 5)
            // sum2(num1: 4, num2: 6)
            
    //        let result = sum3(num1: 5, num2: 7)
    //        print(result)
            
            demo()
            
        }
    
    
        // 任务1: 定义一个没有参数没有返回值的函数
        // 格式: func 函数名() { __函数执行代码__ }
        func demo1(){
            print("哈哈")
        }
        
        
        // 任务1: 定义一个有参数没有返回值的函数
        // Swift中函数的第一参数名字在调用的时候默认省略
        // 格式: func 函数名(形参名1: 类型, 形参名2: 类型, ...) { __函数执行代码__ }
        func sum1(a: Int, b: Int) {
            print(a + b)
        }
        
        // 带有外部参数的函数
        // 格式: func 函数名(外部参数名1 形参名1: 类型, 外部参数名2 形参名2: 类型, ...) { __函数执行代码__ }
        func sum2(num1 a: Int, num2 b: Int) {
            print(a + b)
        }
        /// 定义一个有参数有返回值的函数(有外部参数的函数)
        // 格式: func 函数名(外部参数名1 形参名1: 类型, 外部参数名2 形参名2: 类型, ...) -> 返回值类型 { __函数执行代码__ }
        func sum3(num1 a: Int, num2 b: Int) -> Int {
            return a + b
        }
        
        // 没有返回值的3种表现形式
        
        // 方式1
        func demoAA(){
            
        }
        
        // 方式2
        func demoBB() -> Void {
            
        }
        
        // 方式3
        func demoCC() -> () {
            
        }
        
        
        // 嵌套函数
        func demo(){
            // 作用范围是在当前 demo 的函数体内
            func haha(){
                print("哈哈")
            }
            
            haha()
        }
    View Code

    10.闭包

        override func viewDidLoad() {
            super.viewDidLoad()
            demo3A()
            demo3B()
        }
        
        // MARK: - 定义一个有参数有返回值的闭包
        
        // 任务3: 定义一个有参数有返回值的闭包
        func demo3B(){
            // 闭包的类型: (num1: Int, num2: Int) -> Int
            let clourse = { (num1 a: Int, num2 b: Int) -> Int in
                return a + b
            }
            
            let result = clourse(num1: 5, num2: 6)
            print(result)
            
        }
        
        
        // 内部定义一个有参数有返回值的函数
        func demo3A(){
            
            func sum(num1 a: Int, num2 b: Int) -> Int {
                return a + b
            }
            
            let result = sum(num1: 5, num2: 6)
            print(result)
        }
        
        // MARK: - 定义一个有参数没有返回值的闭包
        
        // 任务2: 定义一个有参数没有返回值的闭包
        func demo2B(){
            
            // 有参数没有返回值的闭包类型: (num1: Int, num2: Int) -> ()
            let clourse = { (num1 a: Int, num2 b: Int) in
                print(a + b)
            }
            
            clourse(num1: 10, num2: 1)
        }
        
        
        // 内部定义一个有参数没有返回值的函数
        func demo2A(){
            
            func sum(num1 a: Int, num2 b: Int) {
                print(a + b)
            }
            sum(num1: 10, num2: 1)
        }
        
        // MARK: - 定义一个没有参数没有返回值的闭包
        
        
        // 任务1: 定义一个没有参数没有返回值的闭包
        func demo1B(){
            // 没有参数没有返回值的闭包的类型: () -> ()
            let clourse = {
                print("哈哈")
            }
            clourse()
            
            
            // 定义一个函数,将上面的闭包作为参数传入
    //        func haha(callback: () -> ()) {
    //            callback()
    //        }
        }
        
        // 内部定义一个没有参数没有返回值的函数
        func demo1A(){
            func haha(){
                print("哈哈")
            }
            haha()
        }
        
        // MARK: - 没有返回值的三种情况
        
        // 如果闭包没有参数没有返回值
        
        func demo1(){
            let clourse1 = { (num1 a: Int, num2 b: Int) -> () in
                print("哈哈")
            }
            
            let clourse2 = { (num1 a: Int, num2 b: Int) -> Void in
                print("哈哈")
            }
            
            let clourse3 = { (num1 a: Int, num2 b: Int) in
                print("哈哈")
            }
            
            
        }
  • 相关阅读:
    C# 控件缩写大全+命名规范+示例
    Database Link详解
    DataTable.Compute 方法
    Dotfuscator Professional Edition 4.9.7500.9484 混淆工具破解版+使用教程
    C#中的委托和事件(续)
    Jquery 获取元素内容
    ASP.NET 常用类
    JavaScript动态生成访问方法
    LINQ查询操作符
    HTML乱码问题和header结构
  • 原文地址:https://www.cnblogs.com/fanglove/p/5225492.html
Copyright © 2020-2023  润新知