Swift Language - GaoZhenWei/SwiftLearning GitHub Wiki

1. Swift中延时调用某个方法

Step 1: 使用GCD(Grand Central Dispatch)中的dispatch_after封装一个通用的函数:

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

Step 2: 调用的方式如下:

// Delay for 2 seconds, then run the code between the braces.
delay(2) {
   self.checkPassword()
}

2. Swift中使用?!的区别

  • 两者都用于定义一个Optinal类型的变量,即可以设置变量的值为nil
  • 使用这两者定义之后,Swift编译器不再强制必须在初始化方法中赋初值了
  • 使用!定义的变量,在使用时Swift编译器会自动对其拆包得到实际值,无须我们手动去拆包
  • 使用?定义的变量,在使用时,需要手动去判断是否为nil,有值时需要手动拆包得到实际值,通常使用 if let语句
  • 当我们能够确定变量在运行期间一直都存在值,那么使用!来定义变量,这样就避免了拆包操作,但是万一其值为nil,则会产生Crash
  • 当变量的值可能为nil时,需要使用?来定义变量

3. Swift中实现CustomStringConvertible协议打印一个类的对象

一般在Swift中使用print函数打印一个对象时,控制台输出的信息是类名,不是我们想要的类的属性的信息。不过我们可以实现CustomStringConvertible接口来实现全局的自定义打印的信息,实现如下:

class Person {
    var name: String!
    var age: Int!
    var birthday: String!
}

extension Person: CustomStringConvertible {
    var description: String {
        return "name = \(self.name) age = \(self.age) birthday = \(self.birthday)"
    }
}

NOTE:可以使用extension来实现这个协议,可以保证类的核心功能的整洁。

4. Swift2.1的Singleton(单例)的实现

Swift2.1语法中实现单例更加的简洁,可以有以下两种方法:

方式一:
class SingletonClass {
    static let sharedInstance = SingletonClass()
}
方式二: 适用于在第一次创建单例时需要做一些初始化操作
class SingletonClass {
    static let sharedInstance: SingletonClass = {
        let instance = SingletonClass()
        
        // 初始化操作
        
        return instance
    }()
}