Swift: hoe krijg ik de tekenreeks voor een bepaald teken?

Hoe krijg ik de tekenreeks voor een bepaald teken in swift? De onderstaande code is hoe ik het deed in Objective C, maar ik kan niet dezelfde taak uitvoeren in Swift. Tips of suggesties om dit te bereiken? rangeOfStringlijkt helemaal niet te werken in swift (hoewel Swift weer tegen me opkomt).

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

Zoals je aan de bovenstaande code kunt zien, kan ik de tekenreeks vóór het spatieteken krijgen in Doelstelling C.

Bewerken: als ik zoiets probeer

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

Ik krijg de volgende foutmelding.

Kan het type ‘NSString’ van de expressie niet converteren naar het type ‘(String,
opties: NSStringCompareOptions, bereik: bereik?, landinstelling:
NSLokale?)’

Ik weet niet zeker wat ik precies verkeerd heb gedaan of hoe ik het correct kan oplossen.


Antwoord 1, autoriteit 100%

Gebruik componentenSeparatedByString() zoals hieronder getoond:

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

Of om uw specifieke geval te gebruiken:

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

Antwoord 2, autoriteit 22%

U kunt hetzelfde doen met rangeOfString()geleverd door de klasse String

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

U kunt het ookbereiken met uw methode 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
}

Ik hoop dat dit je kan helpen;)


Antwoord 3, autoriteit 13%

Vervolg op het antwoord van Syed Tariq: als u alleen de tekenreeks vóór het scheidingsteken wilt (anders krijgt u een array [String]):

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

Antwoord 4, autoriteit 8%

Je zou de methode prefix(upTo:)kunnen gebruiken in Swift 4 of hoger

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

Antwoord 5, autoriteit 7%

Swift 5 extensies

extension String {
    func stringBefore(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(prefix(upTo: index))
        } else {
            return ""
        }
    }
    func stringAfter(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(suffix(from: index).dropFirst())
        } else {
            return ""
        }
    }
}
let str = "n1:lolz"
str.stringBefore(":") // n1
str.stringAfter(":") // lolz
str.stringAfter("z") // empty string
str.stringBefore("n") // empty string
str.stringBefore("g") // empty string

Dit, naar mijn mening, is slechts een uitgangspunt en moet sterk worden afgestemd.

Other episodes