Swift başlarYöntem ile?


151

Swift'te startsWith () yöntemi veya benzeri bir şey var mı?

Temelde belirli bir dize başka bir dize ile başlarsa kontrol etmeye çalışıyorum. Ayrıca büyük / küçük harfe duyarsız olmasını istiyorum.

Söyleyebileceğiniz gibi, ben sadece basit bir arama özelliği yapmaya çalışıyorum ama bu konuda sefil başarısız gibi görünüyor.

İstediğim bu:

"sa" yazmak bana "San Antonio", "Santa Fe" vb. için sonuç vermelidir.

Kullanıyordum

self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil 

iOS9'dan önce ve gayet iyi çalışıyordu. Ancak iOS9'a yükselttikten sonra çalışmayı durdurdu ve şimdi aramalar büyük / küçük harfe duyarlı.

    var city = "San Antonio"
    var searchString = "san "
    if(city.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil){
        print("San Antonio starts with san ");
    }

    var myString = "Just a string with san within it"

    if(myString.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil){
        print("I don't want this string to print bc myString does not start with san ");
    }

CaseInsensitiveSearch ile rangeOfString'in beklendiği gibi çalışmadığı somut bir örnek verebilir misiniz? İOS 9 Simulator'da test ettim ve benim için çalıştı.
Martin R

Yanıtlar:


362

hasPrefixyerine kullanın startsWith.

Misal:

"hello dolly".hasPrefix("hello")  // This will return true
"hello dolly".hasPrefix("abc")    // This will return false

2
OP büyük / küçük harfe duyarsız olmasını ister ve cevabınız büyük / küçük harfe duyarlıdır
Cœur

13
Kullanarak önce dizeleri küçük harfle yapmak çok kolay"string".lowercased()
TotoroTotoro

12

İşte startsWith'in Swift uzantısı uygulaması:

extension String {

  func startsWith(string: String) -> Bool {

    guard let range = rangeOfString(string, options:[.AnchoredSearch, .CaseInsensitiveSearch]) else {
      return false
    }

    return range.startIndex == startIndex
  }

}

Örnek kullanım:

var str = "Hello, playground"

let matches    = str.startsWith("hello") //true
let no_matches = str.startsWith("playground") //false

10

Özellikle büyük / küçük harf duyarsız önek eşleşmesini yanıtlamak için :

saf Swift'te (çoğu zaman önerilir)

extension String {
    func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
        return lowercased().hasPrefix(prefix.lowercased())
    }
}

veya:

extension String {
    func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
        return lowercased().starts(with: prefix.lowercased())
    }
}

not: boş bir önek için ""her iki uygulama da geri dönertrue

Foundation kullanarak range(of:options:)

extension String {
    func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
        return range(of: prefix, options: [.anchored, .caseInsensitive]) != nil
    }
}

not: boş bir önek için ""için geri dönecektirfalse

ve bir regex ile çirkin olmak (gördüm ...)

extension String {
    func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
        guard let expression = try? NSRegularExpression(pattern: "\(prefix)", options: [.caseInsensitive, .ignoreMetacharacters]) else {
            return false
        }
        return expression.firstMatch(in: self, options: .anchored, range: NSRange(location: 0, length: characters.count)) != nil
    }
}

not: boş bir önek ""için geri dönecektirfalse


6

Hızlı 4'te func starts<PossiblePrefix>(with possiblePrefix: PossiblePrefix) -> Bool where PossiblePrefix : Sequence, String.Element == PossiblePrefix.Elementtanıtılacak.

Örnek Kullanım:

let a = 1...3
let b = 1...10

print(b.starts(with: a))
// Prints "true"

6

Düzenleme: Swift 3 için güncellendi.

Swift String sınıfının büyük / küçük harfe duyarlı yöntemi vardır hasPrefix(), ancak büyük / küçük harfe duyarlı olmayan bir arama istiyorsanız NSString yöntemini kullanabilirsiniz range(of:options:).

Not: Varsayılan olarak, NSString yöntemlerdir değil mevcuttur, ama eğerimport Foundation onlar.

Yani:

import Foundation
var city = "San Antonio"
var searchString = "san "
let range = city.range(of: searchString, options:.caseInsensitive)
if let range = range {
    print("San Antonio starts with san at \(range.startIndex)");
}

Seçenekler ya olarak verilebilir .caseInsensitiveveya [.caseInsensitive]. Aşağıdakiler gibi ek seçenekler kullanmak isterseniz ikincisini kullanırsınız:

let range = city.range(of: searchString, options:[.caseInsensitive, .backwards])

Bu yaklaşımın, arama ile arama gibi diğer seçenekleri de kullanabilmesi avantajı vardır .diacriticInsensitive. Aynı sonuç sadece . lowercased()dizgiler kullanılarak elde edilemez .


1

Swift 3 sürümü:

func startsWith(string: String) -> Bool {
    guard let range = range(of: string, options:[.caseInsensitive]) else {
        return false
    }
    return range.lowerBound == startIndex
}

ile daha hızlı olabilir .anchored. Cevabımı gör veya Oliver Atkinson cevabı.
Cœur

1

Uzantıları olan Swift 4'te

Uzantı örneğim 3 işlev içeriyor: subString ile dize başlangıcı yap, subString için dize sonu yap ve dize subString içeriyor mu?

İsCaseSensitive-parametresini false olarak ayarlayın, yoksa "A" veya "a" karakterlerini yoksaymak istiyorsanız aksi halde true olarak ayarlayın.

Nasıl çalıştığı hakkında daha fazla bilgi için koddaki yorumlara bakın.

Kod:

    import Foundation

    extension String {
        // Returns true if the String starts with a substring matching to the prefix-parameter.
        // If isCaseSensitive-parameter is true, the function returns false,
        // if you search "sA" from "San Antonio", but if the isCaseSensitive-parameter is false,
        // the function returns true, if you search "sA" from "San Antonio"

        func hasPrefixCheck(prefix: String, isCaseSensitive: Bool) -> Bool {

            if isCaseSensitive == true {
                return self.hasPrefix(prefix)
            } else {
                var thePrefix: String = prefix, theString: String = self

                while thePrefix.count != 0 {
                    if theString.count == 0 { return false }
                    if theString.lowercased().first != thePrefix.lowercased().first { return false }
                    theString = String(theString.dropFirst())
                    thePrefix = String(thePrefix.dropFirst())
                }; return true
            }
        }
        // Returns true if the String ends with a substring matching to the prefix-parameter.
        // If isCaseSensitive-parameter is true, the function returns false,
        // if you search "Nio" from "San Antonio", but if the isCaseSensitive-parameter is false,
        // the function returns true, if you search "Nio" from "San Antonio"
        func hasSuffixCheck(suffix: String, isCaseSensitive: Bool) -> Bool {

            if isCaseSensitive == true {
                return self.hasSuffix(suffix)
            } else {
                var theSuffix: String = suffix, theString: String = self

                while theSuffix.count != 0 {
                    if theString.count == 0 { return false }
                    if theString.lowercased().last != theSuffix.lowercased().last { return false }
                    theString = String(theString.dropLast())
                    theSuffix = String(theSuffix.dropLast())
                }; return true
            }
        }
        // Returns true if the String contains a substring matching to the prefix-parameter.
        // If isCaseSensitive-parameter is true, the function returns false,
        // if you search "aN" from "San Antonio", but if the isCaseSensitive-parameter is false,
        // the function returns true, if you search "aN" from "San Antonio"
        func containsSubString(theSubString: String, isCaseSensitive: Bool) -> Bool {

            if isCaseSensitive == true {
                return self.range(of: theSubString) != nil
            } else {
                return self.range(of: theSubString, options: .caseInsensitive) != nil
            }
        }
    }

Nasıl kullanılacağına örnekler:

Kontrol için Dize "TEST" ile başlayın:

    "testString123".hasPrefixCheck(prefix: "TEST", isCaseSensitive: true) // Returns false
    "testString123".hasPrefixCheck(prefix: "TEST", isCaseSensitive: false) // Returns true

Kontrol için Dize "test" ile başlayın:

    "testString123".hasPrefixCheck(prefix: "test", isCaseSensitive: true) // Returns true
    "testString123".hasPrefixCheck(prefix: "test", isCaseSensitive: false) // Returns true

Kontrol için Dize "G123" ile biter:

    "testString123".hasSuffixCheck(suffix: "G123", isCaseSensitive: true) // Returns false
    "testString123".hasSuffixCheck(suffix: "G123", isCaseSensitive: false) // Returns true

Kontrol için Dize sonunu "g123" ile yapın:

    "testString123".hasSuffixCheck(suffix: "g123", isCaseSensitive: true) // Returns true
    "testString123".hasSuffixCheck(suffix: "g123", isCaseSensitive: false) // Returns true

Kontrol için Dize "RING12" içerir:

    "testString123".containsSubString(theSubString: "RING12", isCaseSensitive: true) // Returns false
    "testString123".containsSubString(theSubString: "RING12", isCaseSensitive: false) // Returns true

Kontrol için Dize "ring12" içerir:

    "testString123".containsSubString(theSubString: "ring12", isCaseSensitive: true) // Returns true
    "testString123".containsSubString(theSubString: "ring12", isCaseSensitive: false) // Returns true
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.