2015-12-17 3 views
6

У меня есть строка с словами и пробелами «2h 3m 1s». Я хочу извлечь из него 2h; так что получите все перед первым пространством.Получите первое слово в строке слов и пробелов - Подстройте первое слово перед пробелом

var date = "1,340d 1h 15m 52s" // I want to extract "1,340d". 

Какова наилучшая практика? Какая подстрочная функция является наилучшим подходом?

+0

stringbytrimming символов –

+0

@UmaMadhavi Я не хочу чтобы избавиться от всех те пространства. Я хочу получить символы перед первым пробелом. – senty

+0

use (date.componentSeparatedByString ("") as! NSArray) [0] –

ответ

15

Если строка является тяжелым, componentsSeparatedByString() имеет тенденцию быть быстрее.

Swift 2:

var date = "1,340d 1h 15m 52s" 
if let first = date.componentsSeparatedByString(" ").first { 
    // Do something with the first component. 
} 

Swift 3/4:

if let first = date.components(separatedBy: " ").first { 
    // Do something with the first component. 
} 
+0

Лучший подход! Большое спасибо! – senty

+0

Отличный ответ! Просто имейте в виду, что в этом примере, если строка даты пуста, это приведет к сбою. Чтобы избежать этого, вы можете сделать необязательную цепочку. –

9

В этом контексте ни метод .componentsSeparatedByString(" "), ни метод characters.split(" ") не являются «наилучшим подходом». Оба эти метода пройдут весь объект String, и в результате получится Stringмассив. Только после вычисления массива мы извлекаем первую запись этого массива. Если мы рассматриваем огромную строку, в этом контексте это совершенно необязательно, и это приведет к ненужным накладным расходам.

Вместо этого для огромной строки, следующий метод предпочесть:

let firstDateEntryFast = date.substringToIndex((date.rangeOfString(" ")?.first)!) 

Это будет искать индекс первого вхождения " ", а затем возвращает подстроку от начала исходной строки вверх только к первому вхождению. I.e., он никогда не будет исследовать или использовать исходную (в этом контексте: предполагаемую большую) строку за пределами точки первой ошибки " ".

Следует отметить, однако, что из-за разворота силы (оператора (!)), Это приведет к сбою во время выполнения, если строка не содержит никакого экземпляра " ". Таким образом, чтобы оставаться в безопасности, и следовать за дополнительную конвенцию Swift, использовать его в if let пункте:

if let myRange = date.rangeOfString(" ") { 
    let firstDateEntryFast = date.substringToIndex(myRange.first!) 
     // at this point, you know myRange is non-empty, and hence, .first can be 
     // force-unwrapped 
} 
else { 
    let firstDateEntryFast = date 
     // no " " separation, unexpected? -> action 
} 

Как и в моей первой версии ответа, split может быть использован в качестве альтернативы (по сравнению с componentsSeparatedByString):

var date = "1,340d 1h 15m 52s" 
let dateAsArray = date.characters.split(" ").map{ String($0) } 
let firstDateEntry = dateAsArray[0] 

в качестве альтернативы, пропустить хранение их в массиве и непосредственно получить первую запись,

var date = "1,340d 1h 15m 52s" 
let firstDateEntryDirectly = String(date.characters.split(" ")[0]) 
+0

Ace thanksss ... – senty

2

Используйте ниже код для вашего требования

var date = "1,340d 1h 15m 52s" 
print((date.componentsSeparatedByString(" ") as NSArray).objectAtIndex(0)); 
1

Swift 3 версия

var str = "Hello, playground one two three" 
let firstWord = str.components(separatedBy: " ").first 
Смежные вопросы