Apa yang setara dengan Swift dari isEqualToString di Objective-C?


271

Saya mencoba menjalankan kode di bawah ini:

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")
    }
}

Kode saya sebelumnya adalah di Objective-C, yang berfungsi dengan baik:

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

Saya berasumsi saya tidak bisa menggunakan isEqualToStringSwift. Bantuan apa pun akan dihargai.

Jawaban:


428

Dengan Swift Anda tidak perlu lagi memeriksa kesetaraan dengan isEqualToString

Anda sekarang dapat menggunakan ==

Contoh:

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

sekarang sama dengan true.


37
===adalah operator identitas sedangkan operator ==kesetaraan (dengan panggilan default isEqual:pada NSObject dan subkelasnya)
Bryan Chen

3
Ya, maaf, "kesetaraan", bukan identitas. Kata yang salah :)
JJSaccolo

1
Tapi, kecuali jika saya melewatkan sesuatu, tampaknya tidak Anda dapat menguji identitas antara Strings: 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Anda tidak dapat membandingkan String menggunakan operator === karena String di swift adalah tipe struct bukan kelas. Jika Anda mengetikkan teks / string Anda sebagai NSString, Anda dapat membandingkan menggunakan operator ===.
sanjana

3
@JJSaccolo Anda benar-benar menyesatkan dengan bagian identitas. Pertanyaan ini tentang Stringperbandingan. Xcode 6.4 mengembalikan Anda kesalahanBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

Gunakan operator == sebagai gantiisEqual

Membandingkan Strings

Swift menyediakan tiga cara untuk membandingkan nilai String: kesetaraan string, kesetaraan awalan, dan kesetaraan sufiks.

Kesetaraan String

Dua nilai String dianggap sama jika mengandung karakter yang persis sama dalam urutan yang sama:

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"
.
.
.

Untuk selengkapnya baca dokumentasi resmi Swift (pencarian Membandingkan Strings) .


13

Selain saya @JJSaccolojawab, Anda dapat membuat equalsmetode khusus sebagai ekstensi String baru seperti:

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

Dan penggunaan:

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

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

Pasti operator asli ==mungkin lebih baik (berfungsi seperti dalam Javascript) tetapi bagi saya isEqualmetode memberikan beberapa kejelasan kode yang kita bandingkan Strings

Semoga ini bisa membantu seseorang,


8

Di Swift, operator == sama dengan Objective C's isEqual: method (memanggil metode isEqual daripada hanya membandingkan pointer, dan ada metode === baru untuk menguji bahwa pointernya sama), jadi Anda bisa menulis ini sebagai:

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

sementara ini berfungsi dengan cepat - ini akan menyebabkan kerusakan pada objc jika / ketika nama pengguna nihil. Seperti yang disarankan di atas - gunakan username.isEmpty dan ada makro isEmpty yang setara untuk tujuan c di suatu tempat.
johndpope

Di Swift, kecuali jika nama pengguna dinyatakan sebagai String? (alias Opsional <String>) maka tidak boleh nol. Di Objective C Anda bisa mengatakan jika ([panjang nama pengguna] == 0 || [panjang kata sandi] == 0) {...} untuk menutup kasus kosong atau kosong.
Nick Lockwood

6

Sebenarnya, rasanya seperti swift sedang berusaha mempromosikan string agar diperlakukan kurang seperti objek dan lebih seperti nilai. Namun ini tidak berarti di bawah kap swift tidak memperlakukan string sebagai objek, karena saya yakin Anda semua memperhatikan bahwa Anda masih dapat memanggil metode pada string dan menggunakan propertinya.

Sebagai contoh:-

//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)")

Dalam objectC Anda bisa meneruskan referensi ke objek string melalui variabel, di atas metode panggilan di atasnya, yang cukup banyak menetapkan fakta bahwa string adalah objek murni.

Ini adalah tangkapan ketika Anda mencoba untuk melihat String sebagai objek, dengan cepat Anda tidak dapat melewatkan objek string dengan referensi melalui variabel. Swift akan selalu memberikan salinan string yang baru. Oleh karena itu, string lebih dikenal sebagai tipe nilai di swift. Faktanya, dua string literal tidak akan identik (===). Mereka diperlakukan sebagai dua salinan berbeda.

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

Seperti yang dapat Anda lihat, kita mulai melepaskan diri dari cara konvensional menganggap string sebagai objek dan memperlakukannya lebih seperti nilai. Oleh karena itu .isEqualToString yang diperlakukan sebagai operator identitas untuk objek string tidak lebih valid karena Anda tidak akan pernah bisa mendapatkan dua objek string yang identik di Swift. Anda hanya dapat membandingkan nilainya, atau dengan kata lain memeriksa kesetaraan (==).

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

Ini menjadi lebih menarik ketika Anda melihat ketidakmampuan objek string dalam cepat. Tapi itu pertanyaan lain, hari lain. Sesuatu yang mungkin harus Anda perhatikan, karena itu sangat menarik. :) Harapan yang membersihkan beberapa kebingungan. Bersulang!


4

Untuk perbandingan teks UITextField yang saya gunakan kode di bawah ini dan berfungsi dengan baik untuk saya, beri tahu saya jika Anda menemukan kesalahan.

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

3

Dalam Swift isEmptyfungsi itu akan memeriksa apakah string kosong.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.