2016-04-24 12 views
15

स्विफ्ट में संरचनाओं का उपयोग करके लागू संख्याओं, पात्रों और तारों का प्रतिनिधित्व करने वाले प्रकार।क्या इंट, स्ट्रिंग इत्यादि स्विफ्ट में 'प्राइमेटिव' माना जाता है?

official documentation से एक अंश:

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

कि इसका मतलब यह है निम्नलिखित:

Int 
Float 
String 
// etc 

... पुरातन के रूप में नहीं माना जाता है?

उत्तर

17

है हाँ और नहीं ...

अन्य उत्तर के रूप में उल्लेख किया है, स्विफ्ट में भाषा के स्तर में कोई अंतर चीजों के बीच एक "पुरातन" अन्य भाषाओं में और मानक पुस्तकालय में अन्य struct प्रकार या मूल्य प्रकार आप बना सकते हैं के रूप में के बारे में सोचती है स्वयं। उदाहरण के लिए, यह जावा की तरह नहीं है, जहां int और Integer के बीच एक बड़ा अंतर है और अपने स्वयं के प्रकार बनाना संभव नहीं है जो पूर्व की तरह अर्थात् व्यवहार करते हैं। स्विफ्ट में, सभी प्रकार "गैर-आदिम" या "उपयोगकर्ता-स्तर" हैं: भाषा विशेषताएं जो वाक्यविन्यास और अर्थशास्त्र को परिभाषित करती हैं, कहते हैं, IntCGRect या UIScrollView या अपने स्वयं के प्रकारों को परिभाषित करने वालों से अलग नहीं हैं।

हालांकि, अभी भी एक भेद है। एक सीपीयू में पूर्णांक जोड़ने, फ़्लोट्स को गुणा करने और यहां तक ​​कि वेक्टर क्रॉस उत्पादों को लेने जैसे कार्यों के लिए देशी निर्देश हैं, लेकिन रीसेट या खोज सूचियों को शामिल करने जैसे नहीं। जब लोग किसी भाषा के प्रकारों को "प्राइमेटिवली" नाम देते हैं, तो उनमें से एक बात यह है कि वे प्रकार हैं जिनके लिए कंपाइलर अंतर्निहित CPU आर्किटेक्चर में हुक प्रदान करता है, ताकि आप उन प्रकार के साथ जो चीजें करते हैं, सीधे सीपीयू निर्देश। (यह है, इसलिए जैसे "दो पूर्णांकों जोड़ें" संचालन वस्तु लुकअप और फ़ंक्शन कॉल में झमेले में नहीं है।)

स्विफ्ट अभी भी उस गौरव प्राप्त है - Int और Float जैसे कुछ मानक पुस्तकालय प्रकार कर रहे हैं विशेष हैं, जिसमें वे नक्शा बुनियादी सीपीयू संचालन के लिए। (और स्विफ्ट में, संकलक सीधे उन परिचालनों तक पहुंचने के लिए किसी अन्य माध्यम की पेशकश नहीं करता है।)

कई अन्य भाषाओं के साथ अंतर यह है कि स्विफ्ट के लिए, "आदिम" प्रकारों के बीच अंतर और अन्यथा एक कार्यान्वयन विवरण है मानक पुस्तकालय, भाषा की "विशेषता" नहीं।


बस इस विषय में कुछ और पर घूमना करने के लिए ...

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

अन्य भाषाओं में स्ट्रिंग्स "आदिम" होने का अर्थ आम तौर पर सी या जावा में ऐसा कुछ होता है: कंपाइलर का एक विशेष मामला है जहां उद्धरण में कुछ डालने के परिणाम प्रोग्राम बाइनरी में बनने वाले कुछ डेटा में होते हैं, और जगह कोड जहां आपने लिखा था कि उस डेटा पर पॉइंटर प्राप्त करना संभवतः किसी प्रकार के ऑब्जेक्ट इंटरफ़ेस में लपेटा गया है ताकि आप इसके साथ उपयोगी टेक्स्ट प्रोसेसिंग कर सकें। (यानी, एक स्ट्रिंग शाब्दिक है।) हो सकता है कि कंपाइलर में विशेष मामले भी हों ताकि आप उन टेक्स्ट प्रोसेसिंग प्रक्रियाओं में से कुछ के लिए आसान शॉर्टकट प्राप्त कर सकें, जैसे + संगतता के लिए।

स्विफ्ट में, String "आदिम" में है कि यह मानक स्ट्रिंग मानक पुस्तकालय में सभी पाठ संबंधित कार्यों द्वारा इस्तेमाल किया प्रकार है। लेकिन कोई कंपाइलर जादू नहीं है जो आपको अपने स्वयं के स्ट्रिंग प्रकार बनाने से रोकता है जिसे अक्षर के साथ बनाया जा सकता है या ऑपरेटरों के साथ संभाला जा सकता है। तो फिर, स्विफ्ट में "primitives" और उपयोगकर्ता प्रकार के बीच बहुत कम अंतर है।

+0

लेकिन यदि मानक पुस्तकालय में 'Int' लागू किया गया है तो इसे किसी भी "primitives" पर भरोसा करना है। उन प्राइमेटिव क्या हैं? अगर मैं अपना खुद का 'इंट' लागू करना चाहता हूं तो क्या होगा? उदाहरण के लिए मैं एक आदिम 32-बिट संख्या का प्रतिनिधित्व कैसे करूं? – algrid

+0

उत्तर पर वापस देखें: * "और स्विफ्ट में, कंपाइलर उन परिचालनों तक सीधे पहुंचने के लिए किसी अन्य माध्यम की पेशकश नहीं करता है।" * यदि आप [ओपन सोर्स] (https://github.com/apple] पर देखते हैं मानक लाइब्रेरी के लिए/स्विफ्ट/पेड़/fa2f2bd4577e536130f9298fabfd2960a357693c/stdlib/public/core), आप देखेंगे कि "आदिम" प्रकारों में से कई 'बिल्टिन' नामस्थान के माध्यम से संकलक में हुक से जुड़ते हैं। इस तरह की चीजें बुनियादी सीपीयू निर्देशों के रास्ते पर चरण 1 है जो मैंने इस उत्तर में बात की थी, और आईआईआरसी स्विफ्ट कंपाइलर मानक पुस्तकालय के बाहर कोड के लिए उपलब्ध नहीं कराता है। – rickster

2

रूबी की तरह, स्विफ्ट में आदिम प्रकार नहीं हैं। उदाहरण के प्रति

इंट struct रूप में लागू किया और प्रोटोकॉल का पालन हो रहा है:

BitwiseOperationsType
CVarArgType
तुलनीय
CustomStringConvertible
Equatable
Hashable
MirrorPathType
RandomAccessIndexType
SignedIntegerType
SignedNumberType

आप Bool.swift का स्रोत कोड देख सकते हैं जहां Boolimplemented है।

2

स्विफ्ट में आदिम प्रकार नहीं हैं।

सभी प्रोग्रामिंग भाषाओं में, हमारे पास मूल प्रकार हैं जो भाषा का हिस्सा उपलब्ध हैं। तेजी से, हमारे पास संरचनाओं का उपयोग करके बनाई गई स्विफ्ट मानक लाइब्रेरी के माध्यम से इन प्रकारों का लाभ उठाया गया है। इनमें संख्याओं, पात्रों और तारों के प्रकार शामिल हैं।

enter image description here

2

स्विफ्ट में कोई पुरातन रहे हैं।

हालांकि, "मूल्य प्रकार" और "संदर्भ प्रकार" के बीच एक अंतर है। जो सी ++ या जावा उपयोग के साथ काफी फिट नहीं है।

4

नहीं, वे अन्य भाषाओं में प्राइमेटिव परिभाषित करने के अर्थ में प्राइमेटिव नहीं हैं। लेकिन वे प्राइमेटिव्स की तरह व्यवहार करते हैं, इस अर्थ में कि वे मूल्य से गुज़र चुके हैं। यह इस तथ्य से परिणाम है कि वे आंतरिक रूप से structs द्वारा कार्यान्वित कर रहे हैं। पर विचार करें:

import Foundation 

struct ByValueType { 
    var x: Int = 0; 
} 

class ByReferenceType { 
    var x: Int = 0; 
} 

var str: String = "no value"; 
var byRef: ByReferenceType = ByReferenceType(); 
var byVal: ByValueType = ByValueType(); 

func foo(var type: ByValueType) { 
    type.x = 10; 
} 
func foo(var type: ByReferenceType) { 
    type.x = 10; 
} 

func foo(var type: String) { 
    type = "foo was here"; 
} 

foo(byRef); 
foo(byVal); 
foo(str); 

print(byRef.x); 
print(byVal.x); 
print(str); 

उत्पादन

10 
0 
no value 
0

वे आंशिक आदिम हैं।

स्विफ्ट अन्य भाषा (जावा) जैसी आदिम को उजागर नहीं कर रहा है। लेकिन Int, Int16, Float, Double को संरचना का उपयोग करके परिभाषित किया जाता है जो व्युत्पन्न प्राइमेटिव डेटा प्रकार (संरचना) की तरह व्यवहार करता है, ऑब्जेक्ट पॉइंटर नहीं।

स्विफ्ट प्रलेखन आदिम सुविधा के लिए पक्ष में:

1.They Hashable एक्सटेंशन कहना

स्वयंसिद्ध:x == y तात्पर्य x.hashValue == y.hashValue। और हैशवैल्यू वर्तमान असाइन किया गया मान है।

2. अधिकांश काइट विधि प्रकार कास्टिंग और ओवरफ्लो चेक के लिए उपयोग किया जाता है (याद रखें कि सुरक्षित प्रकार सुरक्षित है)।

Int.init(_ other: Float) 

3. नीचे दिए गए कोड को देखें वैकल्पिक प्रकार के साथ डिफ़ॉल्ट मान 0 है। जबकि वैकल्पिक प्रकार चर के साथ NSNumber प्रिंट शून्य।

var myInteger:Int? = Int.init() 
print(myInteger) //Optional(0) 
var myNumber:NSNumber? = NSNumber.init() 
print(myNumber) //nil 

स्विफ्ट प्रलेखन आदिम सुविधा के लिए पक्ष में नहीं: और मिश्रित प्रकार नामित प्रकार:

  1. प्रति दस्तावेज़ के रूप में, वहाँ दो प्रकार के होते हैं। प्राइमेटिव प्रकारों की कोई अवधारणा नहीं है।
  2. इंट समर्थन एक्सटेंशन एक्सटेंशन Int: हैशबल {}
  3. स्विफ्ट मानक लाइब्रेरी के माध्यम से उपलब्ध ये सभी प्रकार मानक कीवर्ड की तरह नहीं हैं।
संबंधित मुद्दे