Tương đương Swift của isEqualToString trong Objective-C là gì?


271

Tôi đang cố chạy mã dưới đây:

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

Mã trước đây của tôi là trong Objective-C, hoạt động tốt:

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

Tôi giả sử tôi không thể sử dụng isEqualToStringtrong Swift. Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


427

Với Swift bạn không cần phải kiểm tra sự bình đẳng nữa isEqualToString

Bây giờ bạn có thể sử dụng ==

Thí dụ:

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

bây giờ làEqual true.


37
===là toán tử nhận dạng trong khi đó ==là toán tử đẳng thức (theo mặc định gọi isEqual:NSObject và các lớp con của nó)
Bryan Chen

3
Vâng, xin lỗi, "bình đẳng", không phải danh tính. Từ sai :)
JJSaccolo

1
Nhưng, trừ khi tôi thiếu thứ gì đó, dường như bạn không thể kiểm tra danh tính giữa các Chuỗi : 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Bạn không thể so sánh Chuỗi bằng toán tử === vì Chuỗi trong swift có kiểu struct không phải là lớp. Nếu bạn nhập cast văn bản / chuỗi của bạn dưới dạng NSString, bạn có thể so sánh bằng toán tử ===.
sanjana

3
@JJSaccolo bạn thực sự sai lệch với phần nhận dạng. Câu hỏi này về Stringso sánh. Xcode 6.4 trả về cho bạn một lỗiBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

Sử dụng toán tử == thay vìisEqual

Chuỗi so sánh

Swift cung cấp ba cách để so sánh các giá trị Chuỗi: đẳng thức chuỗi, đẳng thức tiền tố và đẳng thức hậu tố.

Chuỗi bình đẳng

Hai giá trị Chuỗi được coi là bằng nhau nếu chúng chứa chính xác các ký tự giống nhau theo cùng một thứ tự:

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

Để đọc thêm tài liệu chính thức của Swift (tìm kiếm Chuỗi so sánh) .


13

Tôi ngoài việc @JJSaccolotrả lời, bạn có thể tạo equalsphương thức tùy chỉnh dưới dạng tiện ích mở rộng Chuỗi mới như:

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

Và cách sử dụng:

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

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

Để chắc chắn toán tử gốc ==có thể tốt hơn (hoạt động như trong Javascript) nhưng đối với tôi isEqualphương thức cung cấp một số mã rõ ràng mà chúng ta so sánh Chuỗi

Hy vọng nó sẽ giúp được ai đó,


8

Trong Swift, toán tử == tương đương với phương thức isEqual: của Objective C (nó gọi phương thức isEqual thay vì chỉ so sánh các con trỏ và có một phương thức === mới để kiểm tra các con trỏ giống nhau), vì vậy bạn chỉ cần viết đây là:

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

trong khi điều này hoạt động nhanh chóng - nó sẽ gây ra sự tàn phá trong objc nếu / khi tên người dùng là không. Như đã đề xuất ở trên - sử dụng username.isEmpty và có một macro isEmpty tương đương cho mục tiêu c ở đâu đó.
johndpope

Trong Swift, trừ khi tên người dùng được khai báo là String? (còn gọi là <String> tùy chọn) thì không thể nào được. Trong Mục tiêu C, bạn chỉ có thể nói if ([chiều dài tên người dùng] == 0 || [độ dài mật khẩu] == 0) {...} để bao gồm các trường hợp không hoặc trống.
Nick Lockwood

6

Trên thực tế, có cảm giác như swift đang cố gắng thúc đẩy các chuỗi để được đối xử ít giống như các đối tượng và giống như các giá trị hơn. Tuy nhiên, điều này không có nghĩa là swift không xử lý chuỗi như các đối tượng, vì chắc chắn tất cả các bạn đều nhận thấy rằng bạn vẫn có thể gọi các phương thức trên chuỗi và sử dụng các thuộc tính của chúng.

Ví dụ:-

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

Trong objectC, bạn có thể chuyển tham chiếu đến một đối tượng chuỗi thông qua một biến, bên trên các phương thức gọi trên nó, điều này khá nhiều cho thấy thực tế là các chuỗi là các đối tượng thuần túy.

Đây là cách bắt khi bạn cố gắng xem String dưới dạng các đối tượng, trong swift bạn không thể truyền đối tượng chuỗi bằng cách tham chiếu thông qua một biến. Swift sẽ luôn vượt qua một bản sao hoàn toàn mới của chuỗi. Do đó, các chuỗi thường được gọi là các loại giá trị trong swift. Trong thực tế, hai chuỗi ký tự sẽ không giống nhau (===). Chúng được coi là hai bản sao khác nhau.

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

Như bạn có thể thấy, chúng ta đang bắt đầu phá vỡ lối suy nghĩ thông thường về các chuỗi như các đối tượng và coi chúng giống như các giá trị hơn. Do đó .isEqualToString được coi là toán tử nhận dạng cho các đối tượng chuỗi không còn hợp lệ vì bạn không bao giờ có thể có được hai đối tượng chuỗi giống hệt nhau trong Swift. Bạn chỉ có thể so sánh giá trị của nó hoặc nói cách khác là kiểm tra sự bằng nhau (==).

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

Điều này trở nên thú vị hơn khi bạn nhìn vào khả năng biến đổi của các đối tượng chuỗi trong swift. Nhưng đó là cho một câu hỏi khác, một ngày khác. Một cái gì đó có lẽ bạn nên xem xét, vì nó thực sự thú vị. :) Hy vọng rằng sẽ xóa một số nhầm lẫn. Chúc mừng!


4

Để so sánh văn bản UITextField tôi đang sử dụng mã bên dưới và hoạt động tốt với tôi, hãy cho tôi biết nếu bạn tìm thấy bất kỳ lỗi nào.

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

3

Trong Swift, isEmptyhàm sẽ kiểm tra xem chuỗi có trống không.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.