A weak reference is similar to an unowned reference, where a non-strong (or weak) reference is referencing an instance of a type. The main difference is a weak reference can contain nil. If the instance is deallocated while there is a weak reference referencing it, then the weak reference is set to nil.
Once again, we begin by creating two new classes:
class MyClass1_Weak {
    var name = ""
    var class2: MyClass2_Weak?
    init(name: String) {
        self.name = name
        print("Initializing class1_Weak with name \(self.name)")
    }
    deinit {
        print("Releasing class1_Weak with name \(self.name)")
    }
}
class MyClass2_Weak {
    var name = ""
    weak var class1: MyClass1_Weak?
    init(name: String) {
        self.name = name
        print("Initializing class2_Weak with name \(self.name)")
    }
    deinit...