स्विफ्ट - किस प्रकार का उपयोग करना है? एनएसएसट्रिंग या स्ट्रिंग


109

स्विफ्ट की शुरुआत के साथ, मैं अपने सिर को नई भाषा के चक्कर लगाने की कोशिश कर रहा हूं

मैं एक iOS डेवलपर हूं और NSString, NSInteger, NSDictionaryकिसी एप्लिकेशन में इस प्रकार के उपयोग करूंगा । मैंने देखा है कि Apple द्वारा "द स्विफ्ट प्रोग्रामिंग लैंग्वेज" ईबुक में वे स्विफ्ट प्रकारों का उपयोग करते हैंString, Int, Dictionary

मैंने देखा है कि स्विफ्ट प्रकारों में फाउंडेशन प्रकार के कुछ कार्य हैं (या अलग-अलग नाम हैं)। उदाहरण के लिए NSStringएक lengthसंपत्ति है। लेकिन मैं स्विफ्ट के लिए एक समान नहीं पा रहा हूं String

मैं सोच रहा था, एक iOS एप्लिकेशन के लिए मुझे अभी भी फाउंडेशन के प्रकारों का उपयोग करना चाहिए?


3
पसंद करते हैं String। हालाँकि, Stringअल्फा रिलीज़ में कार्यक्षमता अभी भी सीमित है, इसलिए NSStringअभी के लिए इसका अधिक उपयोग किया जाएगा। हमें उम्मीद है कि वे GA तक एपीआई को ठीक कर देंगे।
सुल्तान

1
इसके अलावा, आप countElements(str)अपने प्रश्न के उस विशिष्ट भाग का उत्तर देने के लिए कॉल कर सकते हैं ।
नैट कुक

बेहतर है, आप कॉल कर सकते हैं "foo".length" directly in Swift. An implicit cast to NSString` आप के लिए संकलक द्वारा जोड़ा जाता है!
गैब्रियल पेट्रोनेला

1
@GabrielePetronella .length विशेष वर्णों के लिए सही ढंग से काम नहीं कर सकती है। जैसे कि इमोजी या चीनी अक्षर जो 2 या 3 यूनिकोड वर्ण को लेते हैं। countElements उपयोग करने के लिए सही विधि है।
फोगमिस्टर

जवाबों:


98

आपको जब भी संभव हो स्विफ्ट देशी प्रकारों का उपयोग करना चाहिए। भाषा उनका उपयोग करने के लिए अनुकूलित है, और अधिकांश कार्यक्षमता देशी प्रकारों और प्रकारों के बीच ब्रिज की गई है Foundation

जबकि Stringऔर NSStringज्यादातर विनिमेय होते हैं, अर्थात, आप Stringचर को उन तरीकों से पारित कर सकते हैं जो NSStringपैरामीटर लेते हैं और इसके विपरीत, कुछ विधियाँ इस पल के रूप में स्वचालित रूप से ब्रिजेड नहीं लगती हैं। देखें इस सवाल का जवाब कैसे एक स्ट्रिंग की लंबाई प्राप्त करने पर चर्चा के लिए और इस उत्तर के प्रयोग पर चर्चा के लिए containsString()सबस्ट्रिंग के लिए जाँच करने के लिए। (अस्वीकरण: मैं इन दोनों उत्तरों के लिए लेखक हूं)

मैंने अन्य डेटा प्रकारों की पूरी तरह से खोज नहीं की है, लेकिन मुझे लगता है कि ऊपर बताए गए कुछ संस्करण Array/ NSArray, Dictionary/ NSDictionary, और स्विफ्ट के विभिन्न प्रकारों के लिए भी सही होंगे।NSNumber

जब भी आप फाउंडेशन प्रकार का उपयोग करने की जरूरत है, तो आप या तो स्पष्ट चर / स्थिरांक टाइप करने के लिए के रूप में, उनका उपयोग कर सकते var str: NSString = "An NSString"या उपयोग bridgeToObjectiveC(), एक स्विफ्ट प्रकार के एक मौजूदा चर / निरंतर पर के रूप में str.bridgeToObjectiveC().lengthउदाहरण के लिए। आप एक Stringका NSStringउपयोग करके भी डाल सकते हैं str as NSString

हालांकि, इन तकनीकों के लिए आवश्यक रूप से फाउंडेशन प्रकारों का स्पष्ट रूप से उपयोग करने के लिए, या उनमें से कम से कम कुछ भविष्य में अप्रचलित हो सकते हैं, क्योंकि भाषा के संदर्भ में जो कहा गया है, String/ NSStringपुल, उदाहरण के लिए, पूरी तरह से निर्बाध होना चाहिए।

विषय पर गहन चर्चा के लिए, कोको और ऑब्जेक्ट-सी के साथ स्विफ्ट का उपयोग करने का संदर्भ लें : कोको डेटा प्रकारों के साथ काम करना


4
bridgeToObjectiveC()NSString और स्विफ्ट के स्ट्रिंग के बीच संबंध को समझाने और समझाने के लिए +1 ।
क्रिस

2
अगर आपको लगता है कि आप अपने जवाब को अपडेट करना चाहते हैं, तो मुझे लगता है कि ब्रिजटॉबजेक्टिव को हटा दिया गया है।
दान ब्यूलियू

मैं स्विफ्ट 3 मैनुअल में देखता हूं कि फाउंडेशन प्रकार संदर्भ द्वारा पारित किए जाते हैं, जबकि देशी प्रकार मूल्य द्वारा पारित किए जाते हैं (या ऐसा कुछ जो मुझे इस बिंदु पर पूरी तरह से समझ में नहीं आता है)। यह बहुत अच्छा होगा यदि आप उस के निहितार्थों पर चर्चा करते हुए अपने उत्तर को अपडेट कर सकते हैं।
निगेल बी। पेक

27

एनएसएसट्रिंग: उन वस्तुओं को बनाता है जो ढेर में रहते हैं और हमेशा संदर्भ द्वारा पारित होते हैं।

स्ट्रिंग: इसका एक मान प्रकार जब भी हम इसे पास करते हैं, तो इसका मूल्य पास हो जाता है। स्ट्रक्चर एंड एनम की तरह, स्ट्रिंग में ही स्ट्रक्चर्स ए स्ट्रक्चर।

public struct String {
 // string implementation 
}

लेकिन जब आप पास होते हैं तो कॉपी नहीं बनाई जाती है। जब आप पहली बार इसे म्यूट करते हैं तो यह कॉपी बनाता है।

स्ट्रिंग स्वचालित रूप से उद्देश्य-सी से NSString के रूप में ब्रिजित होती है। यदि स्विफ्ट स्टैंडर्ड लाइब्रेरी नहीं है, तो आपको NSString द्वारा परिभाषित विधियों तक पहुंचने के लिए फाउंडेशन फ्रेमवर्क आयात करने की आवश्यकता है।

स्विफ्ट स्ट्रिंग बहुत शक्तिशाली है इसमें इनबिल्ट फ़ंक्शन के ढेर सारे हैं।

स्ट्रिंग पर प्रारंभिककरण:

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"

मूल्यों को दोहराने से स्ट्रिंग बनाएं:

 let repeatingString = String(repeating:"123", count:2) // "123123"

स्विफ्ट 4 में -> स्ट्रिंग्स अक्षर का संग्रह हैं:

अब स्ट्रिंग सभी ऑपरेशनों को करने में सक्षम है जो कोई भी संग्रह प्रकार पर प्रदर्शन कर सकता है।

अधिक जानकारी के लिए कृपया सेब दस्तावेज़ देखें।


2
इस जवाब को और अधिक वोट मिलना चाहिए। यह स्ट्रिंग और NSString के बीच मूलभूत अंतर है। हर जगह वे लगभग विनिमेय हैं
अधिकतम

बहुत बढ़िया जवाब। मूल्य बनाम रेफरी नोट विशेष रूप से।
21

11

आपका सबसे अच्छा दांव स्विफ्ट देशी प्रकारों और वर्गों का उपयोग करना है, क्योंकि कुछ अन्य लोगों ने नोट किया है कि एनएसएसट्रिंग ने स्ट्रिंग के लिए मुफ्त अनुवाद किया है, हालांकि, वे एक समान 100% नहीं हैं, उदाहरण के लिए निम्नलिखित लें

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

आपको स्ट्रिंग में वर्णों को गिनने के लिए विधि गणना () का उपयोग करने की आवश्यकता है, यह भी ध्यान दें कि nsstring.length रिटर्न 2 है, क्योंकि यह UTF16 के आधार पर इसकी लंबाई गिना जाता है।

इसी तरह, हाँ वही, नहीं


7

Stringऔर NSStringविनिमेय हैं, इसलिए यह वास्तव में कोई फर्क नहीं पड़ता कि आप किसका उपयोग करते हैं। आप हमेशा का उपयोग करके दोनों के बीच कास्ट कर सकते हैं

let s = "hello" as NSString

या और भी

let s: NSString  = "hello"

NSInteger( intया longवास्तुकला पर निर्भर करता है) के लिए सिर्फ एक उपनाम है , इसलिए मैं सिर्फ उपयोग करूंगा Int

NSDictionaryएक अलग मामला है, क्योंकि Dictionaryएक पूरी तरह से अलग कार्यान्वयन है।

सामान्य तौर पर मैं जब भी कब्जे में आता हूं तो आप तेजी से टाइप कर सकते हैं और bridgeToObjectiveC()स्विफ्ट क्लासेस द्वारा प्रदान की गई विधि का उपयोग करके आप दोनों को हमेशा जरूरत के बीच बदल सकते हैं।


स्विफ्ट का Intडेटा प्रकार, पुस्तक में, वास्तुकला के शब्द आकार के समान होने के लिए कहा गया है। NSIntegerवास्तुकला के शब्द आकार के समान आकार भी है।
MadTheTheSane

6

चूंकि उद्देश्य C प्रकार अभी भी गतिशील रूप से भेजे गए हैं, वे शायद धीमे होने वाले हैं। जब तक आपको उद्देश्य-सी APIs के साथ सहभागिता करने की आवश्यकता न हो, मैं कहता हूं कि आप स्विफ्ट देशी प्रकारों का उपयोग कर सकते हैं


हाँ बिल्कुल जवाब है। और गतिशील रूप से प्रेषण विधियों और ऑब्जेक्ट चर पहुंच से बचा जाता है, जो इस गति में सुधार करता है जो उन्होंने WWDC में बात की थी। अतीत में हर कोई प्रदर्शन के बारे में चिंतित था, सी + + स्ट्रिंग और कंटेनरों का उपयोग करके स्थिर डिस्पैचिंग प्राप्त करता था।
लोथर

5

जब भी आप कर सकते हैं स्विफ्ट देशी प्रकारों का उपयोग करें। स्ट्रिंग के मामले में, हालांकि, आपके पास NSStringइस तरह की सभी विधियों तक "सहज" पहुंच है :

var greeting = "Hello!"
var len = (greeting as NSString).length

4

स्विफ्ट 4 अपडेट

स्ट्रिंग को तेजी से 4 में संशोधन मिलता है। अब आप सीधे उस पर गिनती कर सकते हैं और यह एक इमोजी की तरह, अंगूर के समूहों को 1 टुकड़ा मानते हैं। NSString अपडेट नहीं है और इसे दूसरे तरीके से गिन रहा है।

var nsstring: NSString = "👩‍👩‍👧‍👦"
var string: String = "👩‍👩‍👧‍👦"

print(nsstring.length) // 11
print(string.count)    // 1

1
NSStringशायद अंगूर के गुच्छों से निपटने के लिए अपडेट नहीं किया जाएगा: यह बहुत से ऐप को तोड़ देगा जो पुराने व्यवहार पर निर्भर करते हैं। इसके अलावा, NSString.lengthUTF16 वर्णों की गणना करता है।
MaddTheSane

0

स्ट्रिंग एक संरचना है

// स्विफ्ट मॉड्यूल में

सार्वजनिक संरचना स्ट्रिंग

{

}

NSString एक वर्ग है

// फाउंडेशन मॉड्यूल में

ओपन क्लास NSString: NSObject

{

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.