我目前正在一个小型应用程序进行化学计算。我试图编程一个分子计算器,你只需输入总和公式和它的数量。没有任何数字,它可以完美地工作,例如,如果我输入NaCl
的数量为100
克(在不同的文本字段中输入克数),您将得到约1.73 mol,这是正确的解决方案。检查并得到只有诠释出一串字符串
我现在想要做的是我可以添加数字,例如Na2Cl4
。在我的方法中,字符串被正确分割,如果你打印它,你会得到["Na", "2", "Cl", "4"]
,但我不知道我怎么能得到Int的出来,并记住它们被分配给哪个元素(2到Na和4到Cl,因为我需要将mol/g乘以2)。
我试过以下内容: 该数字将始终在奇数索引上(Na在0,2在1,Cl在2,4在3),所以我试图把每个元素都放在一个奇数索引中新阵列:
var i = 0
var testarray = [String]()
for content in splitted {
if i % 2 == 0 {
}else {
testarray.append(content)
}
print(content)
i += 1
}
splitted是包含拆分和公式的[String]数组。我得到的结果如果我打印出内容是2和4这是很好,但如果我输入例如Na10我得到1和0这是不好,也不知道它分配给哪个元素。
有没有人知道如何解决这个问题,我可以从字符串数组中获取Int值,并记住它们分配给哪个元素?
在此先感谢!
编辑:
继承人的代码我如何分割字符串:
let splitted = summenformel.characters.splitBefore(separator: { $0.isUpperCase }).map{String($0)}
和扩展:
extension Sequence {
func splitBefore(
separator isSeparator: (Iterator.Element) throws -> Bool
) rethrows -> [AnySequence<Iterator.Element>] {
var result: [AnySequence<Iterator.Element>] = []
var subSequence: [Iterator.Element] = []
var iterator = self.makeIterator()
while let element = iterator.next() {
if try isSeparator(element) {
if !subSequence.isEmpty {
result.append(AnySequence(subSequence))
}
subSequence = [element]
}
else {
subSequence.append(element)
}
}
result.append(AnySequence(subSequence))
return result
}
}
extension Character {
var isUpperCase: Bool { return String(self) == String(self).uppercased() }
}
你能告诉我你是如何创建分裂 – Knight0fDragon
考虑使用例如'[A-Z]([A-Z] +)正则表达式?(\\ d +)?',因为一个元素以大写字母总是启动。 – vadian
@ Knight0fDragon这个班很大,去看看我的github吧! [链接](https://github.com/andinator/ProChemistry/blob/master/ProChemistry/CalculatorBrain.swift) – Andi