![](/img/trans.png)
[英]how can I do to use same variable name, but different data type in Swift
[英]How to use variable with the same name as String Swift
我正在嘗試優化我的代碼。 我要執行以下操作:如果字典字典dict
中有一個位於firstNames
數組中的firstNames
我想將此元素直接寫入first
變量,與second
相同,等等。這是我的代碼示例。 我創建了包含鏈接變量firstNames
<-> first
, secondNames
<-> second
等的names
數組。另外,我嘗試遍歷循環並將值設置為first
, second
等,使用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.