簡體   English   中英

如何使用與String Swift同名的變量

[英]How to use variable with the same name as String Swift

我正在嘗試優化我的代碼。 我要執行以下操作:如果字典字典dict中有一個位於firstNames數組中的firstNames我想將此元素直接寫入first變量,與second相同,等等。這是我的代碼示例。 我創建了包含鏈接變量firstNames <-> firstsecondNames <-> second等的names數組。另外,我嘗試遍歷循環並將值設置為firstsecond等,使用val

    let dict = ["type": "1", "word": "abc"] // this is example
    let firstNames = ["1", "2"]
    let secondNames = ["3", "4"]
    var first = String()
    var second = String()
    let names = [firstNames: first, secondNames: second]
    for el in dict {
        for var (key, val) in names {
            if (key as! [String]).contains(el["type"]!) {
                if ((val as! String) != "") {
                    val = (val as! String) + ", " + el["word"]!
                }
                else {
                    val = el["word"]!
                }
            }
        }
    }

此代碼沒有任何運行時錯誤。 但是不幸的是,當我嘗試在循環中設置val時,沒有任何反應。 我做錯了還是有更好的解決方案?

謝謝你的幫助。

Swift是一種編譯后的,主要是靜態的語言,優化器可以自由地完全刪除這些臨時變量(如果不需要)。 局部變量的名稱在運行時不可用。 這種方法行不通。 如果您使用字典將“第一”和“第二”作為字符串鍵(Paulw11指向您的位置),這可能會起作用,但這在Swift中是錯誤的方法。

讓我們從字典開始。 這不是對字典的正確使用。 這不是字符串到字符串的任意映射。 它是特定字段標識符到值的映射。 那就是結構的定義。

“類型”確實有可能是“任意整數”,但我強烈懷疑它實際上是“受約束的值列表中的值”。 那是一個枚舉。

如果我們將它們放在一起,那么dict實際上就是Element:

enum ElementType {
    case one
    case two
    case three
    case four
}

struct Element {
    let type: ElementType
    let word: String
}

您的名稱選擇器是ElementTypes的任意列表:

let firstNameTypes = [ElementType.one, .two]
let secondNameTypes = [ElementType.three, .four]

然后,我們可以想象元素列表(而不是一個字典)(我假設您實際上在此循環之外)。

let elements = [
    Element(type: .one, word: "abc"),
    Element(type: .two, word: "bcd"),
    Element(type: .three, word: "efg"),
    Element(type: .four, word: "fgh"),
]

現在,我們的循環變得微不足道了,並且清楚地說明了這意味着什么。

let firstNames = elements.filter { firstNameTypes.contains($0.type) }
let secondNames = elements.filter { secondNameTypes.contains($0.type) }

並獲得我們的最終字符串也很簡單:

let firstString = firstNames.map { $0.word }.joined(separator: ",")
let secondString = secondNames.map { $0.word }.joined(separator: ",")

盡管這段代碼很清楚,但是它對元素進行了兩次迭代,並對每個元素對“ NameTypes”列表進行了一次迭代。 在大多數情況下,這很好。 這是計算機的工作,但是,如果您有成千上萬的元素(尤其是名稱過濾列表很長),則可能會很昂貴,我們可以編寫一個返回結果字符串字典的函數(通過手動重寫filter )。 如果那是您的問題,我可以寫下來(如果您能更清楚地說明潛在問題),但是在大多數情況下,對於中等大小的列表,這是最好的方法。

我的猜測是'val'是臨時變量,不能分配給它,這樣會影響'dict'字典。

代替

val = ..

嘗試使用

dict[key] = ... 

另外,如果您要描述使用代碼實現的目標,那就太好了。

暫無
暫無

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

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