Как я могу использовать строки нарезки индексов в Swift 4?
у меня есть следующий простой код, написанный на Swift 3:
let str = "Hello, playground"
let index = str.index(of: ",")!
let newStr = str.substring(to: index)
от Xcode 9 beta 5, я получаю следующее предупреждение:
'
substring(to:)
' является устаревшим: пожалуйста, используйтеString
нарезка подстрочного индекса с помощью оператора "частичный диапазон от".
как это нарезка подстрочного индекса с частичным диапазоном от используется в Swift 4?
17 ответов:
вы должны оставить одну сторону пустой, отсюда и название "частичный спектр".
let newStr = str[..<index]
то же касается частичный диапазон от операторы, просто оставьте другую сторону пустой:
let newStr = str[index...]
имейте в виду, что эти операторы возвращают
Substring
. Если вы хотите преобразовать его в строку, используйте С:let newStr = String(str[..<index])
вы можете прочитать больше о новых подстроках здесь.
преобразование подстроки (Swift 3) в строку нарезки (Swift 4)
Примеры В Swift 3, 4:
let newStr = str.substring(to: index) // Swift 3 let newStr = String(str[..<index]) // Swift 4
let newStr = str.substring(from: index) // Swift 3 let newStr = String(str[index...]) // Swift 4
let range = firstIndex..<secondIndex // If you have a range let newStr = = str.substring(with: range) // Swift 3 let newStr = String(str[range]) // Swift 4
Swift 4
использование
let text = "Hello world" text[...3] // "Hell" text[6..<text.count] // world text[NSRange(location: 6, length: 3)] // wor
код
import Foundation extension String { subscript(value: NSRange) -> Substring { return self[value.lowerBound..<value.upperBound] } } extension String { subscript(value: CountableClosedRange<Int>) -> Substring { get { return self[index(at: value.lowerBound)...index(at: value.upperBound)] } } subscript(value: CountableRange<Int>) -> Substring { get { return self[index(at: value.lowerBound)..<index(at: value.upperBound)] } } subscript(value: PartialRangeUpTo<Int>) -> Substring { get { return self[..<index(at: value.upperBound)] } } subscript(value: PartialRangeThrough<Int>) -> Substring { get { return self[...index(at: value.upperBound)] } } subscript(value: PartialRangeFrom<Int>) -> Substring { get { return self[index(at: value.lowerBound)...] } } func index(at offset: Int) -> String.Index { return index(startIndex, offsetBy: offset) } }
преобразование вашего кода в Swift 4 также может быть сделано следующим образом:
let str = "Hello, playground" let index = str.index(of: ",")! let substr = str.prefix(upTo: index)
вы можете использовать код ниже, чтобы иметь новую строку:
let newString = String(str.prefix(upTo: index))
подстрока (от: index)преобразовано в [индекс...]
Регистрация образец
let text = "1234567890" let index = text.index(text.startIndex, offsetBy: 3) text.substring(from: index) // "4567890" [Swift 3] String(text[index...]) // "4567890" [Swift 4]
пример
uppercasedFirstCharacter
свойство удобства в Swift3 и Swift4.свойства
uppercasedFirstCharacterNew
демонстрирует, как использовать строковый индекс нарезки в Swift4.extension String { public var uppercasedFirstCharacterOld: String { if characters.count > 0 { let splitIndex = index(after: startIndex) let firstCharacter = substring(to: splitIndex).uppercased() let sentence = substring(from: splitIndex) return firstCharacter + sentence } else { return self } } public var uppercasedFirstCharacterNew: String { if characters.count > 0 { let splitIndex = index(after: startIndex) let firstCharacter = self[..<splitIndex].uppercased() let sentence = self[splitIndex...] return firstCharacter + sentence } else { return self } } } let lorem = "lorem".uppercasedFirstCharacterOld print(lorem) // Prints "Lorem" let ipsum = "ipsum".uppercasedFirstCharacterNew print(ipsum) // Prints "Ipsum"
некоторые полезные расширения:
extension String { func substring(from: Int, to: Int) -> String { let start = index(startIndex, offsetBy: from) let end = index(start, offsetBy: to - from) return String(self[start ..< end]) } func substring(range: NSRange) -> String { return substring(from: range.lowerBound, to: range.upperBound) } }
вы можете создать свой собственный метод подстроки, используя расширение для строки класса, как показано ниже:
extension String { func subString(startIndex: Int, endIndex: Int) -> String { let end = (endIndex - self.count) + 1 let indexStartOfText = self.index(self.startIndex, offsetBy: startIndex) let indexEndOfText = self.index(self.endIndex, offsetBy: end) let substring = self[indexStartOfText..<indexEndOfText] return String(substring) } }
создание подстроки (префикс и суффикс) из строки с помощью Swift 4:
let str : String = "ilike" for i in 0...str.count { let index = str.index(str.startIndex, offsetBy: i) // String.Index let prefix = str[..<index] // String.SubSequence let suffix = str[index...] // String.SubSequence print("prefix \(prefix), suffix : \(suffix)") }
выход
prefix , suffix : ilike prefix i, suffix : like prefix il, suffix : ike prefix ili, suffix : ke prefix ilik, suffix : e prefix ilike, suffix :
Если вы хотите создать подстроку между 2 показателями , использовать :
let substring1 = string[startIndex...endIndex] // including endIndex let subString2 = string[startIndex..<endIndex] // excluding endIndex
Я написал расширение строки для замены ' String: subString:'
extension String { func sliceByCharacter(from: Character, to: Character) -> String? { let fromIndex = self.index(self.index(of: from)!, offsetBy: 1) let toIndex = self.index(self.index(of: to)!, offsetBy: -1) return String(self[fromIndex...toIndex]) } func sliceByString(from:String, to:String) -> String? { //From - startIndex var range = self.range(of: from) let subString = String(self[range!.upperBound...]) //To - endIndex range = subString.range(of: to) return String(subString[..<range!.lowerBound]) } }
использование :
"Date(1511508780012+0530)".sliceByString(from: "(", to: "+")
Пример Результата : "1511508780012"
PS: Optionals вынуждены разворачиваться. Пожалуйста, добавьте тип проверки безопасности, где это необходимо.
С помощью этого метода можно получить определенный диапазон строк.вам нужно пройти начальный индекс и после этого общее количество символов, которые вы хотите.
extension String{ func substring(fromIndex : Int,count : Int) -> String{ let startIndex = self.index(self.startIndex, offsetBy: fromIndex) let endIndex = self.index(self.startIndex, offsetBy: fromIndex + count) let range = startIndex..<endIndex return String(self[range]) } }
при программировании у меня часто есть строки с просто a-Za-z и 0-9. Нет необходимости в сложных действиях с индексами. Это расширение основано на простых старых левых / средних / правых функциях.
extension String { // LEFT // Returns the specified number of chars from the left of the string // let str = "Hello" // print(str.left(3)) // Hel func left(_ to: Int) -> String { return "\(self[..<self.index(startIndex, offsetBy: to)])" } // RIGHT // Returns the specified number of chars from the right of the string // let str = "Hello" // print(str.left(3)) // llo func right(_ from: Int) -> String { return "\(self[self.index(startIndex, offsetBy: self.length-from)...])" } // MID // Returns the specified number of chars from the startpoint of the string // let str = "Hello" // print(str.left(2,amount: 2)) // ll func mid(_ from: Int, amount: Int) -> String { let x = "\(self[self.index(startIndex, offsetBy: from)...])" return x.left(amount) } }
Это мое решение, без предупреждения, без ошибок, но совершенное
let redStr: String = String(trimmStr[String.Index.init(encodedOffset: 0)..<String.Index.init(encodedOffset: 2)]) let greenStr: String = String(trimmStr[String.Index.init(encodedOffset: 3)..<String.Index.init(encodedOffset: 4)]) let blueStr: String = String(trimmStr[String.Index.init(encodedOffset: 5)..<String.Index.init(encodedOffset: 6)])
надеюсь, что это поможет немного больше : -
var string = "123456789"
если вы хотите подстроку после определенного индекса.
var indexStart = string.index(after: string.startIndex )// you can use any index in place of startIndex var strIndexStart = String (string[indexStart...])//23456789
если вы хотите подстроку после удаления какой-то строки в конце.
var indexEnd = string.index(before: string.endIndex) var strIndexEnd = String (string[..<indexEnd])//12345678
вы также можете создавать индексы со следующим кодом : -
var indexWithOffset = string.index(string.startIndex, offsetBy: 4)
надеюсь, что это будет полезно.
extension String { func getSubString(_ char: Character) -> String { var subString = "" for eachChar in self { if eachChar == char { return subString } else { subString += String(eachChar) } } return subString } } let str: String = "Hello, playground" print(str.getSubString(","))
Swift4:
extension String { func subString(from: Int, to: Int) -> String { let startIndex = self.index(self.startIndex, offsetBy: from) let endIndex = self.index(self.startIndex, offsetBy: to) return String(self[startIndex...endIndex]) } }
использование:
var str = "Hello, playground" print(str.subString(from:1,to:8))