Каков более элегантный способ удаления всех символов после определенного символа в объекте String в Swift

Каков более элегантный способ удаления всех символов после определенного символа в объекте String в Swift?

Предположим, что у меня есть следующая строка:

str.str

и мне нужно удалить из него ".str". Как я могу это сделать?

Спасибо заранее.

Ответы

Ответ 1

Вот как это сделать:

var str = "str.str"

if let dotRange = str.rangeOfString(".") {
    str.removeRange(dotRange.startIndex..<str.endIndex)
}

Обновление В Swift 3 это:

var str = "str.str"

if let dotRange = str.range(of: ".") {
  str.removeSubrange(dotRange.lowerBound..<str.endIndex)
}

Ответ 2

Я думаю, что это лучший подход:

Обновление с помощью Swift 4: (подстрока теперь устарела)

let smth = "element=value"

if let index = (smth.range(of: "=")?.upperBound)
{
  //prints "value"
  let afterEqualsTo = String(smth.suffix(from: index))

  //prints "element="
  let beforeEqualsToContainingSymbol = String(smth.prefix(upTo: index))
}

if let index = (smth.range(of: "=")?.lowerBound)
{
  //prints "=value"
  let afterEqualsToContainingSymbol = String(smth.suffix(from: index))

  //prints "element"
  let beforeEqualsTo = String(smth.prefix(upTo: index))
}

Ответ 3

Довольно компактный способ:

var str = "str.str"
str = str.componentsSeparatedByString(".")[0]

Еще один вариант, который может вас заинтересовать, который работает для вашего примера "str.str", но не соответствует вашей спецификации:

str = str.stringByDeletingPathExtension
// Returns a new string made by deleting the extension (if any, and only the last)
// from the `String`

Ответ 4

Swift 5.1 🔸

/**
 * Splits a string at the first occurrence of a delimiter string
 * ## Examples:
 * splitAtFirst(str: "element=value", delimiter: "=") // "element", "value"
 */
public static func splitAtFirst(str: String, delimiter: String) -> (a: String, b: String)? {
   guard let upperIndex = (str.range(of: delimiter)?.upperBound), let lowerIndex = (str.range(of: delimiter)?.lowerBound) else { return nil }
   let firstPart: String = .init(str.prefix(upTo: lowerIndex))
   let lastPart: String = .init(str.suffix(from: upperIndex))
   return (firstPart, lastPart)
}