从插值字符串中获取变量

时间:2016-02-29 18:35:41

标签: ios swift

我在带有变量的UITableViewCell中有一个字符串。 例如:var toDoItem:String = String("名称:\(名称)和数量:\(数量)和颜色:\(颜色)"

这在tableview单元格中显示为一个字符串。 名称将添加到名称的[String]中,数量将添加到数组的int数组[Int]中,依此类推。

如果我方便删除单元格,我应该能够删除该行的名称,数量和颜色。但由于这是一个字符串,我必须能够单独访问这些变量以从相关数组中扣除。

如果给出插值字符串,我如何才能访问变量?

感谢。

2 个答案:

答案 0 :(得分:0)

如果您的值全部采用“key:value”形式,后跟空格或字符串末尾,则此函数可能适用于您:

import Foundation

func valueFromKeyInString(key:String, string:String) -> String? {
  if let keyRange = string.rangeOfString(key) {
    let endIndex = string.rangeOfString(" ", options: [], range:
      (keyRange.startIndex..<string.endIndex), locale: NSLocale.currentLocale())?.startIndex ??
      string.endIndex
      return string.substringWithRange(keyRange.endIndex..<endIndex)
  }
  return nil
}

// how it's used:
let string = "the name:bob and quantity:12 and color:red"
let name = valueFromKeyInString("name:", string: string)         // => "bob"
let quantity = valueFromKeyInString("quantity:", string: string) // => "12"
let color = valueFromKeyInString("color:", string: string)       // => "red"

然后,您可以使用这些字符串转换为您需要的值。

正则表达式也可以工作,但如果你能确定字符串的格式,这是一个相当简单的解析。当然,如果您可以访问实际值,那么您应该尝试获取这些值而不是解析字符串。

答案 1 :(得分:0)

@Carlos是对的 - 您不希望从您创建的演示文稿字符串中解析数据。您必须已将变量namequantitycolor存储在cellForRowAtIndexPath

中使用的某个位置

如果数据已存储在数组中,则可以在删除单元格时使用indexPath来查找数据。

这是我之前做过的一个例子,我的数据保存在数组sourceAlbumNames

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return sourceAlbumNames.count;
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell


    cell.textLabel?.text = sourceAlbumNames[indexPath.row] as String

    return cell
}

我猜你已经有类似的东西用于删除

func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
    if (editingStyle == UITableViewCellEditingStyle.Delete) {
        // handle delete (by removing the data from your array and updating the tableview)

         sourceAlbumNames.removeAtIndex(indexPath!.row)
         tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}