उद्देश्य-सी में isEqualToString के स्विफ्ट के बराबर क्या है?


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

मेरा पिछला कोड ऑब्जेक्टिव-सी में था, जो ठीक काम कर रहा था:

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

मुझे लगता है कि मैं isEqualToStringस्विफ्ट में उपयोग नहीं कर सकता । किसी भी सहायता की सराहना की जाएगी।

जवाबों:


427

स्विफ्ट के साथ आपको समानता की जांच करने की आवश्यकता नहीं है isEqualToString

अब आप उपयोग कर सकते हैं ==

उदाहरण:

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

अब isEqual है true


37
===पहचान ऑपरेटर है जबकि ==समानता ऑपरेटर ( isEqual:NSObject और उसके उपवर्गों पर डिफ़ॉल्ट कॉल द्वारा )
ब्रायन चेन

3
हाँ, क्षमा करें, "समानता", पहचान नहीं। गलत शब्द :)
JJSaccolo

1
लेकिन, जब तक मैं कुछ याद नहीं कर रहा हूं, ऐसा नहीं लगता कि आप स्ट्रिंग्स के बीच की पहचान का परीक्षण कर सकते हैं 'String' does not conform to protocol 'AnyObject':।

3
@ user1040049 आप स्ट्रिंग की तुलना === ऑपरेटर का उपयोग करके नहीं कर सकते क्योंकि तेजी से स्ट्रिंग टाइप की नहीं क्लास की है। यदि आप अपने पाठ / स्ट्रिंग को NSString के रूप में लिखते हैं तो आप === ऑपरेटर का उपयोग करके तुलना कर सकते हैं।
संजाना

3
@JJSaccolo आप वास्तव में पहचान वाले हिस्से के साथ भ्रामक हैं। Stringतुलना के बारे में यह सवाल । Xcode 6.4 आपको एक त्रुटि देता हैBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

के बजाय == ऑपरेटर का उपयोग करेंisEqual

तुलना स्ट्रिंग्स

स्ट्रिंग मूल्यों की तुलना करने के लिए तीन तरीके प्रदान करता है: स्ट्रिंग समानता, उपसर्ग समानता और प्रत्यय समानता।

स्ट्रिंग समानता

दो स्ट्रिंग मानों को समान माना जाता है यदि वे समान क्रम में समान वर्ण होते हैं:

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

यकीन है कि मूल ऑपरेटर ==बेहतर हो सकता है (जावास्क्रिप्ट में काम करता है) लेकिन मेरे लिए isEqualविधि कुछ कोड स्पष्टता देती है कि हम स्ट्रिंग्स की तुलना करते हैं

आशा है कि यह किसी को मदद करेगा,


8

स्विफ्ट में, == ऑपरेटर ऑब्जेक्टिव C के आइक्वल के बराबर है: विधि (यह सिर्फ पॉइंटर्स की तुलना करने के बजाय इस्क्वल विधि को कॉल करता है, और परीक्षण के लिए एक नया === तरीका है जो यह बताता है कि पॉइंटर्स समान हैं), इसलिए आप बस लिख सकते हैं यह इस प्रकार है:

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

हालांकि यह तेजी से काम करता है - यदि उपयोगकर्ता नाम शून्य है तो यह ओबीसी में तबाही मचाएगा। जैसा कि ऊपर बताया गया है - username.isEmpty का उपयोग करें और कहीं न कहीं उद्देश्य c के लिए समतुल्य isEmpty मैक्रो है।
जॉन्डपोप

स्विफ्ट में, जब तक कि उपयोगकर्ता को स्ट्रिंग घोषित नहीं किया जाता है? (उर्फ वैकल्पिक <स्ट्रिंग>) तो यह शून्य नहीं हो सकता। ऑब्जेक्टिव सी में आप सिर्फ यह कह सकते हैं कि ([उपयोगकर्ता नाम लंबाई] == 0 || [पासवर्ड की लंबाई] == 0) {...} शून्य या खाली मामलों को कवर करने के लिए।
निक लॉकवुड

6

दरअसल, ऐसा महसूस होता है कि स्विफ्ट स्ट्रिंग्स को वस्तुओं की तरह कम और मूल्यों की तरह व्यवहार करने के लिए बढ़ावा देने की कोशिश कर रहा है। हालाँकि, इसका मतलब यह नहीं है कि हुड स्विफ्ट के तहत स्ट्रिंग्स को ऑब्जेक्ट के रूप में व्यवहार नहीं करता है, जैसा कि आप सभी ने देखा है कि आप अभी भी स्ट्रिंग्स पर तरीकों को लागू कर सकते हैं और उनके गुणों का उपयोग कर सकते हैं।

उदाहरण के लिए:-

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

ऑब्जेक्ट सी में आप एक चर ऑब्जेक्ट के संदर्भ को एक चर के माध्यम से पास कर सकते हैं, उस पर कॉलिंग विधियों के शीर्ष पर, जो कि इस तथ्य को स्थापित करता है कि तार शुद्ध ऑब्जेक्ट हैं।

जब आप स्ट्रिंग को ऑब्जेक्ट के रूप में देखने का प्रयास करते हैं, तो यहां पकड़ है, तेजी से आप एक चर ऑब्जेक्ट को एक चर के माध्यम से संदर्भ द्वारा पारित नहीं कर सकते। स्विफ्ट हमेशा स्ट्रिंग की एक नई प्रति पारित करेगी। इसलिए, स्ट्रिंग्स को आमतौर पर स्विफ्ट में मूल्य प्रकार के रूप में जाना जाता है। वास्तव में, दो स्ट्रिंग लीटर समान नहीं होंगे (===)। उन्हें दो अलग-अलग प्रतियों के रूप में माना जाता है।

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

जैसा कि आप देख सकते हैं कि हम स्ट्रिंग्स को वस्तुओं के रूप में सोचने के पारंपरिक तरीके से तोड़ना शुरू कर रहे हैं और उन्हें अधिक मूल्यों की तरह व्यवहार कर रहे हैं। इसलिए .isEqualToString जो स्ट्रिंग ऑब्जेक्ट्स के लिए एक पहचान ऑपरेटर के रूप में व्यवहार किया गया था वह अधिक वैध नहीं है क्योंकि आप स्विफ्ट में दो समान स्ट्रिंग ऑब्जेक्ट कभी नहीं प्राप्त कर सकते हैं। आप केवल इसके मूल्य की तुलना कर सकते हैं, या दूसरे शब्दों में समानता (==) की जांच कर सकते हैं।

 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फ़ंक्शन स्विफ्ट में यह जांच करेगा कि क्या स्ट्रिंग खाली है।

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.