Подтвердить что ты не робот

Swift: Как получить строку перед определенным символом?

Как получить строку перед определенным символом в swift? Ниже приведен код, как я это сделал в Objective C, но, похоже, не может выполнять одну и ту же задачу в Swift. Любые советы или предложения о том, как достичь этого? rangeOfString похоже, не работает вообще в быстрой (хотя Swift снова действует на меня).

NSRange range = [time rangeOfString:@" "];
NSString *startDate =
[time substringToIndex:range.location];

Как вы можете видеть из приведенного выше кода, я могу получить строку перед символом пробела в Objective C.

Изменить: если я попробую что-то вроде этого

 var string = "hello Swift"
 var range : NSRange = string.rangeOfString("Swift")

Я получаю следующую ошибку.

Невозможно преобразовать тип выражения 'NSString' в тип '(String, options: NSStringCompareOptions, диапазон: Range?, locale: NSLocale?)

Не уверен, что я сделал неправильно или как правильно его решить.

4b9b3361

Ответ 1

Используйте componentsSeparatedByString(), как показано ниже:

var delimiter = " "
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])

Или использовать ваш конкретный случай:

var delimiter = " token1"
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])

Ответ 2

Вы можете сделать то же самое с rangeOfString(), предоставленным String классом

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   let firstPart = string[string.startIndex..<range.startIndex]
   print(firstPart) // print Hello
}

Вы также можете выполнить его с помощью своего метода substringToIndex()

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   firstPart = string.substringToIndex(range.startIndex)
   print(firstPart) // print Hello
}

Swift 3 UPDATE:

let string = "Hello Swift"
if let range = string.range(of: "Swift") {
    let firstPart = string[string.startIndex..<range.lowerBound]
    print(firstPart) // print Hello
}

Надеюсь, это поможет вам;)

Ответ 3

После ответа Syed Tariq: Если вы хотите только строку перед разделителем (в противном случае вы получите массив [String]):

var token = newstr.components(separatedBy: delimiter).first

Ответ 4

Если вы хотите получить решение, которое не включает в себя создание основы, вы можете сделать это с помощью find и нарезки:

let str = "Hello, I must be going."

if let comma = find(str, ",") {
    let substr = str[str.startIndex..<comma]
    // substr will be "Hello"
}

Если вам явно нужна пустая строка в случае, когда такой символ не найден, вы можете использовать оператор nil-coalescing:

let str = "no comma"
let comma = find(str, ",") ?? str.startIndex
let substr = str[str.startIndex..<comma]  // substr will be ""

Примечание. В отличие от метода componentsSeparatedByString это не требует создания массива и требует только сканирования до первого появления символа, а не разбиения всей строки на массив с разделителями символов.

Ответ 5

Мои 2 цента:-) с помощью Swift 3.0, аналогично PHP strstr

extension String {

    func strstr(needle: String, beforeNeedle: Bool = false) -> String? {
        guard let range = self.range(of: needle) else { return nil }

        if beforeNeedle {
            return self.substring(to: range.lowerBound)
        }

        return self.substring(from: range.upperBound)
    }

}

Usage1

"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello

Usage2

"Hello, World!".strstr(needle: " ") // returns World!

Ответ 6

Чтобы мутировать String в часть до первого появления указанной строки, вы можете расширить String следующим образом:

extension String {

    mutating func until(_ string: String) {
        var components = self.components(separatedBy: string)
        self = components[0]
    }

}

Это можно так назвать:

var foo = "Hello Swift"
foo.until(" Swift") // foo is now "Hello"

Ответ 7

Вы можете использовать rangeOfString, но он возвращает тип Range<String.Index>, а не NSRange:

let string = "hello Swift"
if let range = string.rangeOfString("Swift") {
    print(string.substringToIndex(range.startIndex))
}

Ответ 8

let string = "Hello-world"
if let range = string.range(of: "-") {
let firstPart = string[(string.startIndex)..<range.lowerBound]
 print(firstPart) 
}

Вывод: Hello

Ответ 9

Ниже приведен вид целой комбо

let string = "This a string split using * and this is left."
if let range = string.range(of: "*") {
    let lastPartIncludingDelimiter = string.substring(from: range.lowerBound)
    print(lastPartIncludingDelimiter) // print * and this is left.

    let lastPartExcludingDelimiter = string.substring(from: range.upperBound)
    print(lastPartExcludingDelimiter) // print and this is left.

    let firstPartIncludingDelimiter = string.substring(to: range.upperBound)
    print(firstPartIncludingDelimiter) // print This a string split using *

    let firstPartExcludingDelimiter = string.substring(to: range.lowerBound)
    print(firstPartExcludingDelimiter) // print This a string split using
}

Ответ 10

Вы можете использовать префикс метода (upTo :) в Swift 4 или выше

var string = "hello Swift"
if let index = string.firstIndex(of: " ") {
    let firstPart = string.prefix(upTo: index)
    print(firstPart) // print hello
}