Objective-C'deki isEqualToString'in Swift eşdeğeri nedir?


271

Aşağıdaki kodu çalıştırmak çalışıyorum:

import UIKit

class LoginViewController: UIViewController {

@IBOutlet var username : UITextField = UITextField()
@IBOutlet var password : UITextField = UITextField()

@IBAction func loginButton(sender : AnyObject) {

    if username .isEqual("") || password.isEqual(""))
    {
        println("Sign in failed. Empty character")
    }
}

Önceki kodum gayet iyi çalışan Objective-C idi:

 if([[self.username text] isEqualToString: @""] ||
    [[self.password text] isEqualToString: @""] ) {

isEqualToStringSwift'te kullanamayacağımı düşünüyorum . Herhangi bir yardım mutluluk duyacağız.

Yanıtlar:


428

Swift ile artık eşitliği kontrol etmenize gerek yok isEqualToString

Artık kullanabilirsiniz ==

Misal:

let x = "hello"
let y = "hello"
let isEqual = (x == y)

şimdi eşittir true.


37
===kimlik operatörleriyken ==eşitlik operatörüdür (varsayılan isEqual:olarak NSObject ve alt sınıflarına çağrıda bulunur)
Bryan Chen

3
Evet, özür dilerim, "eşitlik", kimlik değil. Yanlış kelime :)
JJSaccolo

1
Ben bir şey eksik sürece Fakat, test edebilirsiniz görünmüyor kimliğini Strings arasında: 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Swift içindeki String sınıf değil, struct türünde olduğu için === operatörünü kullanarak String'i karşılaştıramazsınız. Metninizi / dizenizi NSString olarak yayınlarsanız, === operatörünü kullanarak karşılaştırabilirsiniz.
sanjana

3
@JJSaccolo kimlik kısmı ile gerçekten yanıltıcı. StringKarşılaştırma ile ilgili bu soru . Xcode 6.4 size bir hata döndürürBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

Kullan == yerine operatörisEqual

Dizeleri Karşılaştırma

Swift, Dize değerlerini karşılaştırmak için üç yol sağlar: dize eşitliği, önek eşitliği ve sonek eşitliği.

Dize Eşitliği

Aynı dizede tam olarak aynı karakterleri içeriyorlarsa, iki String değeri eşit kabul edilir:

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    println("These two strings are considered equal")
}
// prints "These two strings are considered equal"
.
.
.

Swift'in resmi belgelerini daha fazla okumak için (arama karşılaştırma dizeleri) .


13

Ben @JJSaccolocevap ek olarak , equalsgibi yeni String uzantısı olarak özel yöntem oluşturabilirsiniz :

extension String {
     func isEqualToString(find: String) -> Bool {
        return String(format: self) == find
    }
}

Ve kullanım:

let a = "abc"
let b = "abc"

if a.isEqualToString(b) {
     println("Equals")
}

Emin orijinal operatör ==daha iyi olabilir (Javascript gibi çalışır) ama benim için isEqualyöntemi dizeleri karşılaştırmak bazı kod netliği verir

Umarım birine yardım eder,


8

Swift'te == operatörü, Objective C'nin isEqual: yöntemine eşdeğerdir (yalnızca işaretçileri karşılaştırmak yerine isEqual yöntemini çağırır ve işaretçilerin aynı olduğunu test etmek için yeni bir === yöntemi vardır, böylece yazabilirsiniz. şöyle:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}

bu hızlı bir şekilde çalışırken - kullanıcı adı nil olduğunda / olduğunda objc'de hasara neden olur. Yukarıda önerildiği gibi - kullaniciadi.isEmpty'yi kullanın ve bir yerde objektif c için eşdeğer bir isEmpty makrosu var.
johndpope

Swift'te, kullanıcı adı Dize olarak bildirilmedikçe? (aka İsteğe bağlı <String>) o zaman sıfır olamaz. Objective C'de ([kullanıcı adı uzunluğu] == 0 || [şifre uzunluğu] == 0) {...} nil veya boş vakaları kapsıyorsa söyleyebilirsiniz.
Nick Lockwood

6

Aslında, hızlı bir şekilde nesnelerin daha az ve daha çok değer gibi davranılması için dizeleri teşvik etmeye çalışıyor gibi geliyor. Ancak bu, kaput swift'in altında dizeleri nesne olarak işlemediği anlamına gelmez, eminim hepiniz hala dizelerde yöntemleri çağırabileceğinizi ve özelliklerini kullanabileceğinizi fark ettiniz.

Örneğin:-

//example of calling method (String to Int conversion)
let intValue = ("12".toInt())
println("This is a intValue now \(intValue)")


//example of using properties (fetching uppercase value of string)
let caUpperValue = "ca".uppercaseString
println("This is the uppercase of ca \(caUpperValue)")

ObjectC'de, bir dize nesnesine başvuruyu, değişkenlerin üzerinden, çağrı yöntemlerinin üstünde, dizelerin saf nesneler olduğu gerçeğini hemen hemen belirleyen bir değişken aracılığıyla iletebilirsiniz.

Dize'ye nesne olarak bakmaya çalıştığınızda yakalamanız, hızlıca bir dize nesnesini bir değişken aracılığıyla referans olarak geçiremezsiniz. Swift her zaman dizenin yepyeni bir kopyasını geçirir. Bu nedenle, dizeler daha hızlı olarak değer türleri olarak bilinir. Aslında, iki dize değişmezi aynı olmaz (===). İki farklı kopya olarak ele alınırlar.

let curious = ("ca" === "ca")
println("This will be false.. and the answer is..\(curious)")

Gördüğünüz gibi, karakter dizilerini nesne olarak düşünme ve onlara daha çok değerler gibi davranma yolundan kopmaya başlıyoruz. Bu nedenle, dize nesneleri için kimlik operatörü olarak kabul edilen .isEqualToString, Swift'te asla iki özdeş dize nesnesi alamayacağınız için artık geçerli değildir. Yalnızca değerini karşılaştırabilir veya başka bir deyişle eşitliği kontrol edebilirsiniz (==).

 let NotSoCuriousAnyMore = ("ca" == "ca")
 println("This will be true.. and the answer is..\(NotSoCuriousAnyMore)")

Hızlı bir şekilde dize nesnelerinin değişebilirliğine baktığınızda bu daha ilginç hale gelir. Ama bu başka bir soru için, başka bir gün. Muhtemelen bakmanız gereken bir şey, çünkü gerçekten ilginç. :) Bu biraz karışıklık giderir umarım. Şerefe!


4

UITextField metin karşılaştırması için aşağıdaki kodu kullanıyorum ve benim için iyi çalışıyor, herhangi bir hata bulursanız bana bildirin.

if(txtUsername.text.isEmpty || txtPassword.text.isEmpty)
{
    //Do some stuff
}
else if(txtUsername.text == "****" && txtPassword.text == "****")
{
    //Do some stuff
}

3

Swift isEmptyişlevinde dizenin boş olup olmadığını kontrol eder.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
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.