2016-11-05 4 views
0

У меня есть массив имен и хочу, чтобы отфильтровать тех, который имеет первую или вторую букву «Е», из приведенного ниже массиваSwift rangeOfString 0 или 1

var userNames = ["John","Tom","Ed","Ben","Albert"] 

outputShould быть [ «Ed» ,"Бен"]. Альберт не должен быть включен в положение не с 1-го или второго

let filteredNames = userName.filter { (inputStr) -> Bool in 

    if let inputRang = inputStr.range(of: "e", options: .caseInsensitive, range: nil, locale: nil) 
    { 
     //How do I check the position 0 or 1 here 

     return true 
    } 
    return false 
} 

ответ

1
let result = userNames.filter { $0.lowercased().characters.prefix(2).contains("e") } 

print(result) // ["Ed", "Ben"] 

Это должно сделать это.

+0

Любопытно - что произойдет, если в массиве есть однобуквенная строка? – rmaddy

+0

@rmaddy: Тогда 'prefix (2)' возвращает только первый (единственный) элемент - параметр 'maxLength'. –

+0

где я могу прочитать о «$ 0» и что это означает? – zombie

2

@Eendje выложила имеет хорошее и эффективное решения для достижения своей цели, но ответить на ваш прямой вопрос: Вы должны рассчитать расстояние из строк начального индекса (inputStr.startIndex) в положение где подстрока была найдена (inputRange.lowerBound):

let filteredNames = userNames.filter { (inputStr) -> Bool in 
    if let inputRange = inputStr.range(of: "e", options: .caseInsensitive) { 
     if inputStr.distance(from: inputStr.startIndex, to: inputRange.lowerBound) <= 1 { 
      return true 
     } 
    } 
    return false 
} 

Другой вариант заключается в ограничении диапазона поиска:

let filteredNames = userNames.filter { (inputStr) -> Bool in 
    let range = inputStr.startIndex ..< inputStr.index(inputStr.startIndex, offsetBy: 2) 
    return inputStr.range(of: "e", options: .caseInsensitive, range: range) != nil 
} 
+0

Спасибо. Интересно, как можно использовать нижнюю границу. Ваш ответ тоже помогает. – andyPaul