swift001

作者: 呦释原点 | 来源:发表于2017-03-09 23:06 被阅读16次
    前言

    现在的swift也算是成熟了吧,感觉再不学习swift就要被淘汰了,以后做一下学习swift的笔记。想做的时候就做点,忘记写笔记了就不写了,随性一点 ----自己胡扯

    swift和OC的不同

    应该是有很多不同点只记录其中的一点

    1. 初始化() 代替 alloc / init let btn = UIButton()
    2. 访问属性可以不同self, 直接使用属性名 view.addSubview(v)
    3. 类方法就是方法名字前面加了static
    4. 一行一句时不用使用;结尾J
    5. 枚举类型可以直接使用 .枚举值调用
    6. @selector 变为 #selector()监听方法,,带参数不用使用冒号‘:’
    7. 打印方法名使用 #function
    一些技巧
    1. option + cmd + / 出现注释斜线
    2. 输入color后回车有奇迹
    3. 标注
      3.1 // MARK: - 标注1
      3.2 // MARK: 标注2
      3.2 // TODO: 要做的
      3.4 // FIXME: 要修改的
    4. iv.image = #imageLiteral(resourceName: "hhhha") --->这个在代码中不是这样的 输入图片名字后回车显示图片很好看
    5. 任何不同的类型之间,不允许直接计算,需要显示转化 例如Int(a)
    6. swift不存在基本数据类型,都是结构体
    7. 先使用let生命变量,需要改时再用var
    8. 使用!强制拆包时要确定变量有值
    9. 仅仅一个()表示空执行
    10. if let/var else 连用判断可选类型是否为空
    iflet-else 和guard let-else-return
    func f() {
        let oName: String? = nil
        let oAge: Int? = nil
    
        if let name = oName, let age = oAge {
            print(name + String(age))  // oName和oAge都不为空才执行,name 和age只能在这个区域中访问
        } else {
            print("nil")  // 执行    oName和oAge有一个为nil值便执行else语句
        }
        // 如果oName和oAge有一个为nil值,执行else后面的语句,然后return(不能少), 如果oName和oAge都不为空,跳过else语句继续执行,name和age可以访问了
        guard let name = oName, let age = oAge else{
            print("nil") // 执行
            return  // 退出了
        }
        
        print(name + String(age))
     
    }
    

    100个tipz中优雅的使用if let,其中有一个为nil便结束了

    if let value = JSON(json)["menu"]["popup"]["menuitem"][0]["value"].string {
        print(value)
    }
    
    switch
    /*
     1. swift 可以直接对任意类的值进行分支, 不再局限于整数
     2.一般不需要break
     3.可以使用',',分开多值
     4.所有分支至少需要一条指令,如果什么都不干才使用break
     5.swift中 可以进行复制和使用where字句
     */
    
    func demo(num: String) {
        switch num {
        case "10", "9":
            print("优秀")
        default:
            print("一般")
        }
    }
    
    demo(num: "9")
    
    func f2() {
        let point = CGPoint(x: 10, y: 10)
        switch point {
        case let p where p.x == 0 && p.y == 0:
            print("原点")
        default:
            print("11")
        }
    }
    
    for循环
    for i in 0..<5 {
        print(i)
    }
    
    let r2 = 0..<5 // 类型  CountableRange<Int>
    let r1 = 0...5  // 类型  CountableClosedRange<Int>
    print(r1)  // 0...5
    
    for i in (0...5).reversed() {
        print(i)
    }
    
    字符串
    // 字符串遍历
    let str = "今天天气不错"
    for c in str.characters {
        print(c)
    }
    // 字符串长度
    print(str.lengthOfBytes(using: .utf8))  //返回指定编码的字节  一个汉字3个字节
    print(str.characters.count) //6 字符串长度,返回字符的个数
    let ocStr = str as NSString    // 值 as 类型  --> 类型转换
    print(ocStr.length) // 6
    
    // 字符串拼接
    let name = "老王"
    let age = 18
    let title: String? = "BOSS"
    let point = CGPoint(x: 1.0, y: 2.0)
    let str = " \(name) \(age) \(title ?? "") \(point)"  //  老王 18 BOSS (1.0, 2.0)
    
    // 格式化
    let h = 8
    let m = 9
    let s = 6
    let dateStr1 = String(format: "%02d:%02d:%02d", h, m, s) // 08:09:06
    
    字符串的子串
    // 一般使用NSString作为中转, 因为Swift取子串的方法一直在优化
    let str = "我们一起加油!"
    print(str.substring(from: "我们".endIndex))  // 一起加油!
    print(str.substring(to: "asd".endIndex))  // 我们一
    func hh() {
        let str = "我们一起加油!"
        guard let range = str.range(of: "一起") else {
            print("meiyou zhao dao")
            return
        }
        print(str.substring(with: range))
    }
    // 转换成OC
    let ocStr = str as NSString
    let s1 =  ocStr.substring(with: NSRange(location: 2, length: 3)) // 一起加
    print(s1)
    
    print("------")
    let greeting = "Guten Tag!"
    greeting[greeting.startIndex]  // G
    greeting[greeting.index(after: greeting.startIndex)] // u
    greeting[greeting.index(before: greeting.endIndex)] // !
    let index = greeting.index(greeting.startIndex, offsetBy: 7)
    greeting[index] // a
    //greeting[greeting.endIndex] // error  越界
    
    for index in greeting.characters.indices {
        print("\(greeting[index]) ", terminator: "")  // G u t e n   T a g !
    }
    
    var welcom = "hello"
    welcom.insert("!", at: welcom.endIndex)  // hello!
    
    
    welcom.insert(contentsOf:" there".characters, at: welcom.index(before: welcom.endIndex)) // "hello there!"
    welcom.remove(at: welcom.index(before: welcom.endIndex))  // hello there
    
    let range = welcom.index(welcom.endIndex, offsetBy: -6)..<welcom.endIndex
    welcom.removeSubrange(range) // hello
    
    数组
    let array = ["张三", "小芳", "小样"]
    let p1 = CGPoint(x: 1, y: 2)
    let arr1 = ["张三", 1, p1] as [Any]  // arr1 中元素的类型为 Any
    

    数组的遍历
    数组反向遍历可以避免删除操作时造成的崩溃, 例如,删除数组中的一个后继续操作数组,正向遍历,删除一个后元素后,后面的元素向前补齐,序号和一开始就不一样了。。。 后续遍历时,删除其中的一个,后面的元素向前补齐,后面的元素就已经操作过了,

    let array = ["张三", "小芳", "小样"]
    for i in 0..<array.count {
        print(array[i])
    }
    
    for s in array {
        print(s)
    }
    
    for s in array.reversed() {
        print(s)
    }
    
    // 3.enum block  遍历  同时遍历下标和内容
    for e in array.enumerated().reversed() {
        print(e) // e 为元组类型   (offset: Int, element: String)
        print(e.offset)
        print(e.element)
    }
    /*
     2, 小样
     1, 小芳
     0, 张三
     */
    // 4.遍历下标和内容
    for (n, s) in array.reversed().enumerated() {       // 错误的反序遍历 索引和内容不一样
        print("\(n), \(s)")  // n 索引下标  s 对应的元素  n、s名字随便起
    }
    /*
     0, 小样
     1, 小芳
     2, 张三
     */
    for (n, s) in array.enumerated().reversed() { // 正确的反序遍历  应该先枚举再反序
        print("\(n), \(s)")  // n 索引下标  s 对应的元素  n、s名字随便起
    }
    
    /*
     2, 小样
     1, 小芳
     0, 张三
     */
    
    
    var array = ["张三", "小芳", "小样"]
    // 追加元素
    array.append("老王")
    // 修改
    array[0] = "李四"
    //array[5] = "呵呵哒" // 数组越界
    // 删除
    array.remove(at: 2)
    array.removeLast()
    array.removeFirst()
    array.removeAll()
    array.removeAll(keepingCapacity: true) // 删除全部保留空间    bool值只有true 和 false   
    
    数组的容量
    func dd() {
        var array: [Int]  // 声明
        array = [Int]()   // 初始化
        
        var array2 = [Int]()  // 声明和初始化一起
        
        for i in 0..<8 {
            array2.append(i)
            print("\(array2) 容量 \(array2.capacity)")
        }
        /*  插入元素时,如果容量不够会✖️2(初始为0,第一次就是2), 如果容量不够会在现有的基础上乘以2,可以避免每次都分配空间
        
     [0] 容量 2
     [0, 1] 容量 2
     [0, 1, 2] 容量 4
     [0, 1, 2, 3] 容量 4
     [0, 1, 2, 3, 4] 容量 8
     [0, 1, 2, 3, 4, 5] 容量 8
     [0, 1, 2, 3, 4, 5, 6] 容量 8
     [0, 1, 2, 3, 4, 5, 6, 7] 容量 8
     */
    }
    // 如果初始化指定容量,可以避免插入数据时,重复分配空间,效率会高一点点
    //NSMutableArray *arrM = [NSMutableArray arrayyWithCapacity:10];
    
    // 数组的合并
    var arr = ["1", "2", "3"]
    let arr2 = ["🙄", "😀", "💔"]
    let arr3 = arr + arr2  // 要合并的两个数组的类型必须一致     ["1", "2", "3", "🙄", "😀", "💔"]
    
    
    字典
    // 1.定义
    var  dic = ["name": "张三", "age": 18] as [String : Any]
    let array = [
        ["name": "张三", "age": 18],
        ["school": "jialidun", "score": 00]
    ]
    /*
     所有对象能被转成JSON(字典或者数组) 必须遵守:
     1.节点是数组/字典
     2.所有对象必须是 NSString, NSNumber or  NSNull, NSArray、NSDictionary可以嵌套使用
     3.所有的KEY都是NSString
     4.NSNumber不能为nil或者无穷大
     */
    print(array)
    
    // 增删改  是通过KEY取值的  KEY唯一  如果KEY不存在就是新增,KEY存在就是修改
    dic["title"] = "新增加的"
    dic["name"] = "改过名了"
    dic.removeValue(forKey: "age")
    // 字典是通过KEY来定位值的,KEY必须是可以’hash 哈希‘的  MD5 是一种 
    // hash 就是将字符串变换成唯一的’整数‘ ,便于查找,提高字典遍历的速度
    
    // 遍历
    for e in dic {
        print(e)  // e 的 类型  (key: String, value: Any)
        print(e.key)
        print(e.value)
    }
    for (key, value) in dic {
        print("\(key): \(value)")
    }
    
    // 合并 
    // 字典不能直接相加
    let dic2 = ["name": "😑", "school": "🏠"]
    for e in dic2 {
        dic[e.key] = dic2[e.key]
    }
    

    心态变则意识变,意识变则行为变,行为变则习惯变,习惯变则性格变,性格变则命运变。

    相关文章

      网友评论

          本文标题:swift001

          本文链接:https://www.haomeiwen.com/subject/raywgttx.html