สวิฟท์เทียบเท่า isEqualToString ใน Objective-C คืออะไร?


271

ฉันพยายามเรียกใช้รหัสด้านล่าง:

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

รหัสก่อนหน้าของฉันอยู่ใน Objective-C ซึ่งทำงานได้ดี:

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

ฉันคิดว่าฉันไม่สามารถใช้งานisEqualToStringSwift ได้ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


428

ด้วย Swift คุณไม่จำเป็นต้องตรวจสอบความเท่าเทียมกันอีกต่อไป isEqualToString

ตอนนี้คุณสามารถใช้ ==

ตัวอย่าง:

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

ตอนนี้ IsEqual trueคือ


37
===เป็นผู้ประกอบการตัวตนในขณะที่==เป็นผู้ประกอบการความเท่าเทียมกัน (โดยโทรเริ่มต้นisEqual:ใน NSObject และ subclasses ของมัน)
ไบรอันเฉิน

3
ใช่ขอโทษ "ความเท่าเทียมกัน" ไม่ใช่ตัวตน คำผิด :)
JJSaccolo

1
แต่เว้นแต่ฉันหายไปบางสิ่งบางอย่างก็ไม่ได้ดูเหมือนคุณสามารถทดสอบตัวตนระหว่าง 'String' does not conform to protocol 'AnyObject'Strings:

3
@ user1040049 คุณไม่สามารถเปรียบเทียบ String โดยใช้โอเปอเรเตอร์ === เพราะ String ใน swift เป็นประเภท struct ไม่ใช่คลาส หากคุณพิมพ์ข้อความหรือสตริงเป็น NSString คุณสามารถเปรียบเทียบโดยใช้โอเปอเรเตอร์ ===
sanjana

3
@JJSaccolo คุณเข้าใจผิดเกี่ยวกับส่วนตน คำถามนี้เกี่ยวกับStringการเปรียบเทียบ Xcode 6.4 ส่งคืนข้อผิดพลาดให้คุณBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

ใช้ตัวดำเนินการ==แทนisEqual

การเปรียบเทียบสตริง

Swift มีสามวิธีในการเปรียบเทียบค่าสตริง: ความเท่าเทียมกันของสตริง, ความเท่าเทียมกันของคำนำหน้าและความเท่าเทียมกันต่อท้าย

ความเท่าเทียมกันของสตริง

สองค่าสตริงถือว่ามีค่าเท่ากันหากมีอักขระเหมือนกันทั้งหมดในลำดับเดียวกัน:

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

สำหรับอ่านเอกสารอย่างเป็นทางการของสวิฟท์(ค้นหาเปรียบเทียบสตริง)


13

ฉันยัง@JJSaccoloตอบคุณสามารถสร้างequalsวิธีการที่กำหนดเองเป็นส่วนขยายสตริงใหม่เช่น:

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

และการใช้งาน:

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

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

เพื่อให้แน่ใจว่าตัวดำเนินการดั้งเดิม==อาจจะดีกว่า (ใช้งานได้เหมือนใน Javascript) แต่สำหรับฉันisEqualวิธีการให้รหัสชัดเจนบางอย่างที่เราเปรียบเทียบสตริง

หวังว่ามันจะช่วยให้ใครบางคน


8

ใน Swift ตัวดำเนินการ == เทียบเท่ากับ isEqual: method ของ Objective C (เรียกว่าวิธี isEqual แทนที่จะเปรียบเทียบตัวชี้และมีวิธี === ใหม่สำหรับการทดสอบว่าตัวชี้เหมือนกัน) ดังนั้นคุณสามารถเขียนได้ นี่คือ:

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

ในขณะที่ใช้งานได้อย่างรวดเร็ว - มันจะทำให้เกิดความเสียหายใน objc ถ้า / เมื่อชื่อผู้ใช้เป็นศูนย์ ตามที่แนะนำข้างต้น - ใช้ชื่อผู้ใช้ isEmpty และมีมาโคร isEmpty ที่เทียบเท่ากันสำหรับวัตถุประสงค์ c
johndpope

ใน Swift ยกเว้นว่าชื่อผู้ใช้ถูกประกาศเป็น String? (aka ตัวเลือก <String>) จากนั้นไม่สามารถเป็นศูนย์ได้ ในวัตถุประสงค์ C คุณสามารถบอกได้ว่า ([ความยาวชื่อผู้ใช้] == 0 || [ความยาวรหัสผ่าน] == 0) {... } เพื่อครอบคลุมกรณีที่ไม่มีหรือว่างเปล่า
Nick Lockwood

6

ที่จริงแล้วมันรู้สึกว่า swift กำลังพยายามโปรโมตสตริงเพื่อให้ได้รับการปฏิบัติน้อยลงเช่นวัตถุและค่านิยมอื่น ๆ อย่างไรก็ตามสิ่งนี้ไม่ได้หมายความว่าภายใต้ประทุนแบบรวดเร็วไม่ถือสายเป็นวัตถุอย่างแน่นอนคุณสังเกตเห็นว่าคุณยังสามารถเรียกใช้เมธอดบนสตริงและใช้คุณสมบัติของมันได้

ตัวอย่างเช่น:-

//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 คุณสามารถส่งการอ้างอิงไปยังอ็อบเจกต์สตริงผ่านตัวแปรด้านบนของวิธีการเรียกใช้ซึ่งมันค่อนข้างจะสร้างความจริงที่ว่าสตริงนั้นเป็นวัตถุบริสุทธิ์

นี่คือการจับเมื่อคุณพยายามดู String เป็นวัตถุใน swift คุณไม่สามารถส่งผ่านวัตถุสตริงโดยการอ้างอิงผ่านตัวแปร Swift จะส่งสำเนาสตริงใหม่ล่าสุดเสมอ ดังนั้นสตริงจึงเป็นที่รู้จักกันทั่วไปว่าเป็นประเภทของค่าที่รวดเร็ว ความจริงแล้วตัวอักษรสตริงสองตัวจะไม่เหมือนกัน (===) พวกเขาจะถือว่าเป็นสองสำเนาที่แตกต่างกัน

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

อย่างที่คุณเห็นเราเริ่มแตกทางจากวิธีคิดแบบสตริงเป็นวัตถุและปฏิบัติต่อพวกมันเหมือนค่านิยม ดังนั้น. isEqualToString ซึ่งถือว่าเป็นตัวดำเนินการระบุตัวตนสำหรับวัตถุสตริงจะไม่ถูกต้องอีกต่อไปเนื่องจากคุณไม่สามารถรับวัตถุสตริงที่เหมือนกันสองตัวใน Swift คุณสามารถเปรียบเทียบค่าของมันเท่านั้นหรือในคำอื่น ๆ ตรวจสอบความเท่าเทียมกัน (==)

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

สิ่งนี้น่าสนใจยิ่งขึ้นเมื่อคุณดูความผันแปรของวัตถุสตริงอย่างรวดเร็ว แต่นั่นเป็นคำถามอื่นวันอื่น บางสิ่งที่คุณน่าจะมองเข้าไปทำให้มันน่าสนใจจริงๆ :) หวังว่าจะเคลียร์ความสับสน ไชโย!


4

สำหรับการเปรียบเทียบข้อความ UITextField ที่ฉันใช้ด้านล่างรหัสและทำงานได้ดีสำหรับฉันแจ้งให้เราทราบหากคุณพบข้อผิดพลาดใด ๆ

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

3

ในisEmptyฟังก์ชั่นSwift มันจะตรวจสอบว่าสตริงว่างเปล่าหรือไม่

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.