Ios 如何使用与字符串Swift同名的变量
我正在尝试优化我的代码。我想执行以下操作:如果字典Ios 如何使用与字符串Swift同名的变量,ios,swift,swift2,Ios,Swift,Swift2,我正在尝试优化我的代码。我想执行以下操作:如果字典dict中有一个元素,它位于firstNames数组中,我想将这个元素直接写入first变量,与second等相同。这里是我的代码示例。我已经创建了names数组,其中包含链接变量first,secondNames,secondNames等。 此外,我还尝试迭代循环,并使用val将值设置为first、second等 let dict = ["type": "1", "word": "abc"] // this is example
dict
中有一个元素,它位于firstNames
数组中,我想将这个元素直接写入first
变量,与second
等相同。这里是我的代码示例。我已经创建了names
数组,其中包含链接变量first
,secondNames
,secondNames
等。
此外,我还尝试迭代循环,并使用val
将值设置为first
、second
等
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
时,什么都没有发生。我做错了什么,或者可能有更优雅的解决方案
谢谢您的帮助。我猜“val”是临时变量,无法赋值,因此会影响“dict”字典 而不是
val = ..
试用
dict[key] = ...
另外,如果您能描述一下您试图用代码实现什么,那就太好了。Swift是一种编译过的、主要是静态的语言,如果不需要,优化器可以完全删除这些临时变量。本地变量的名称在运行时不可用。这种方法行不通。如果使用字典将“first”和“second”作为字符串键(Paulw11指的就是这个键),这可能会起作用,但在Swift中这是错误的方法 让我们从dict开始。这不是字典的正确用法。这不是字符串到字符串的任意映射。它是特定字段标识符到值的映射。这就是结构的定义 “类型”可能真的是“任意整数”,但我强烈怀疑它实际上是“受约束的值列表中的值”。这是一个枚举 如果我们把这些放在一起,dict实际上是一个元素:
enum ElementType {
case one
case two
case three
case four
}
struct Element {
let type: ElementType
let word: String
}
您的名称选择器是任意的元素类型列表:
let firstNameTypes = [ElementType.one, .two]
let secondNameTypes = [ElementType.three, .four]
然后,我们可以想象元素列表,而不仅仅是一个dict(我假设您实际上在这个循环之外)
现在我们的循环很简单,并且清楚地说明了它的含义
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”列表进行了一次迭代。在绝大多数情况下,这很好。这是计算机所做的,但是如果你有数千个元素(特别是如果名称筛选列表很长的话),它可能会很昂贵,我们可以编写一个函数,返回结果字符串的字典(通过手工重写
过滤器)。如果这是你的问题,我可以写下来(如果你能更清楚地解释潜在的问题),但在大多数情况下,对于中等规模的列表,这是最好的方法。我没有完全按照你想要的做。你能举例说明一下dict的样子吗?现在,您的名称
变量是一个字典,名称为数组,值为字符串([[string],string]
)。@PaulPeelen补充道,我的问题更多的是检测是否有变量1abc
,然后写入1abcd
,如果有2abc
,然后写入2abcd
,如果我有3abc
,那么写3abcd
。。。我的意思是,如何从变量1的相同名称(部分相同)中获取变量2的名称您不能使用另一个变量的变量名称写入变量。使用字典,键作为“变量名”@Paulw11如果我有一个字典,键作为“变量名”,值作为变量(例如'let secondDict=[“variable”:variable]),那么我将如何写入变量?如果我使用
secondDict[“variable”]=“smth”`我只会更新一个字典,但我需要更新variable
。这将返回无法通过下标赋值下标是get,而且我认为,dict[key]
将写入dict,而不是写入该位置的变量,比我要写的答案要好。但是,您可以像let firstNameTypes:[ElementType]=[.one、.two]
这样强制转换名称选择器;我还没有决定最好的款式是什么。在第一个元素中是显式的或提供一个类型。我对哪个更好没有什么强烈的意见。(请注意,我不会称您的方法为“铸造”。这是不准确的,可能会引起混淆。您提供的是显式类型。)并排查看,我可能会更喜欢您的方法。@RobNapier感谢您的回答。当有人回答得如此详细而不是记录投票时,这真是太棒了。顺便说一句,您在第let firstString=firstNames.map{$0.word}.joined(分隔符:“,”)
-->类型字符串的值没有成员“joined”
@RobNapier要有无错误的答案,您可以将.joined(分隔符:“,”
更改为.joinewithseparator(“,”).joined(分隔符:)
是Swift 3版本<代码>joinedWithSeparator()
是Swift 2.2版本。这是唯一的区别。
let firstString = firstNames.map { $0.word }.joined(separator: ",")
let secondString = secondNames.map { $0.word }.joined(separator: ",")