美文网首页
小知识点

小知识点

作者: 得_道 | 来源:发表于2021-01-11 16:44 被阅读0次

    关键字说明

    @discardableResult
    默认情况下编译器就是会去检查返回参数是否有被使用,没有的话就会给出警告。如果你不想要这个警告,可以自己手动加上 @discardableResult

    associatedtype
    swift中protocol不能使用<T>这种泛型,但是提供了associatedtype关键字来支持泛型


    static与class的区别

    被class修饰的类型方法,下标,允许被子类重写
    被static修饰的类型方法,下标,不允许被子类重写


    for-区间运算符用在数组上

    let names = ["aaa","bbb", "ccc", "ddd"]
    for name in names[0...3] {
        print(name)
    }
    
    • 单侧区间:让区间朝一个方向尽可能远
    for name in names[2...] {
        print(name)
    }
    
    for name in names[...2] {
        print(name)
    }
    
    for name in names[..<2] {
        print(name)
    }
    
    let range1 = ...5
    range1.contains(7)//false
    range1.contains(4)//true
    range1.contains(-3)//true
    

    区间类型

    let range1: ClosedRange<Int> = 1...3
    let range2: Range<Int> = 1..<3
    let range3: PartialRangeThrough<Int> = ...5
    
    • 字符、字符串也能使用区间字符串,但默认不能用在for-in中
    let stringRange1 = "cc"..."ff"
    stringRange1.contains("cb")
    stringRange1.contains("dz")
    stringRange1.contains("fg")
    
    let stringRange2 = "a"..."f"
    stringRange2.contains("d")
    stringRange2.contains("h")
    

    从\0到~囊括了所有可能要用到的ASCII字符

    let characterRange: ClosedRange<Character> = "\0"..."~"
    characterRange.contains("G")
    

    带间隔的区间值

    let hours = 11
    let hourInterval = 2
    // tickMark的取值: 从4开始,累加2,不超过11
    for tickMark in stride(from: 4, through: hours, by: hourInterval) {
        print(tickMark)
    } //4 6 8 10
    

    fallthrough

    • 使用fallthrough可以实现贯串效果
    var number = 1
    switch number {
    case 1:
        print("number is 1")
        fallthrough
    case 2:
        print("number is 2")
        
    default:
        print("number is other")
        
    }
    //number is 1
    //number is 2
    

    标签语句

    你可以在循环语句或 switch 语句前面加上标签,它由标签名和紧随其后的冒号(:)组成。在 break 和 continue 后面跟上标签名可以显式地在循环语句或 switch 语句中改变相应的控制流。

    outer: for i in 1...4 {
        for k in 1...4 {
            if k == 3 {
                continue outer
            }
            
            if i == 3 {
                break outer
            }
            print("i == \(i), k == \(k)")
        }
    }
    

    Swift自带的Print打印函数

    public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
    
    print(1,2,3,4) // 1 2 3 4
    print(1,2,3,4, separator: "_") // 1_2_3_4
    

    typealias

    用来给类型起别名

    typealias Byte = Int8
    typealias Short = Int16
    typealias Long = Int64
    
    typealias Date = (year: Int, month: Int, day: Int)
    func test(_ date: Date) {
        print(date.0)
        print(date.year)
    }
    test((2020, 10, 9))
    
    typealias IntFn = (Int, Int) -> Int
    
    func difference(v1: Int, v2: Int) -> Int {
        v1 - v2
    }
    
    let fn: IntFn = difference
    fn(10, 20)
    
    func setFn(_ fn: IntFn) {}
    setFn(difference)
    
    func getFn() -> IntFn {
        difference
    }
    
    • 按照Swift的标准库的定义,Void就是空元组()
    public typealias Void = ()
    

    延迟执行dispatch_after

    OC

    __weak typeof(self) weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ {
        __strong typeof(self) pThis = weakSelf;
    });
    
    
    

    swift

    DispatchQueue.main.asyncAfter(deadline: .now()+0.5, execute: {
        
    })
    

    变量名与关键字冲突

    可以使用('')包裹住变量名,这样就可以用了

    /// Shared singleton instance used by all `AF.request` APIs. Cannot be modified.
    public static let `default` = Session()
    

    检测API可用性

    if #available(iOS 10, macOS 10.12, *) {
        // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
    } else {
        // 使用先前版本的 iOS 和 macOS 的 API
    }
    
    if #available(平台名称 版本号, ..., *) {
        APIs 可用,语句将执行
    } else {
        APIs 不可用,语句将不执行
    }
    

    相关文章

      网友评论

          本文标题:小知识点

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