簡體   English   中英

如何在 Swift 的一般用例中訪問類型的 didSet?

[英]How can I access to didSet of a Type in general use case in Swift?

我正在研究一種稱為UIL的自定義類型,代表Unique Identifiable Label ,這是我的代碼:

struct UIL: Equatable {

    init?(labelValue: String) {

        if checkLabelAvailability(for: labelValue) {
            
            identifiableLabelCollection.insert(labelValue)
            self.labelValue = labelValue
            
        }
        else {
            return nil
        }
        
    }

    var labelValue: String
    
    static func ==(lhs: UIL, rhs: UIL) -> Bool {
        return lhs.labelValue == rhs.labelValue
    }
    
}

var identifiableLabelCollection: Set<String> = Set<String>()


func checkLabelAvailability(for label: String) -> Bool {
    return !identifiableLabelCollection.contains(label)
}

這是我的用例:

var myLabel: UIL? = UIL(labelValue: "Hello, world")

if let unwrappedValue: UIL = myLabel {
    print("myLabel:", unwrappedValue.labelValue)
}

myLabel = UIL(labelValue: "Hello, world!")

if let unwrappedValue: UIL = myLabel {
    print("myLabel:", unwrappedValue.labelValue)
}


myLabel = UIL(labelValue: "Hello, world")

if let unwrappedValue: UIL = myLabel {
    print("myLabel:", unwrappedValue.labelValue)
}
else {
    print("cannot use it! myLabel is now nil!")
}

這是結果:

myLabel:你好,世界

myLabel:你好,世界!

不能用! myLabel 現在為零!

問題就在這里,我應該從集合中刪除替換的 UIL 字符串以使其可用於下一次訪問,我可以將代碼放入myLabel的 didSet 中以實現此目標,但我想讓這發生在秘密中,讓開發人員可以自由地考慮它. 我想訪問 UIL 類型的 didSet ,然后如果 oldValue 和 newValue 彼此不同,我從集合中刪除 label 字符串。

我看到的唯一解決方案是使UIL成為 class 然后刪除deinit中的值

deinit {        
    identifiableLabelCollection.remove(labelValue)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM