مقدمة
تعد إضافة ميزات أو بناء جملة السكر إلى سلاسل النص الشائعة في لغات البرمجة المختلفة. خذ لغة C التي يعرفها الجميع على سبيل المثال. تعتبر سلسلة C في الأساس صفيف أحرف ، ولكن في كل مرة تدخل فيها سلسلة ، لا تحتاج إلى إدخال ["H" ، "E" ، "L" ، "L" ، "O"] ، فقط اضغط على مرحبًا ، لأن المترجم يقوم بهذه العملية نيابة عنك.
اللغات الأكثر تقدماً مثل سلاسل Swift Handles ليس فقط كصفائف أحرف ، فإن String عبارة عن نوع كامل وله خصائص مختلفة. دعونا نلقي نظرة أولاً على ميزة String: Sundring.
ألق نظرة على السلسلة
أولاً ، دعونا نتحمل فهمًا تقريبيًا لتنفيذ الأوتار. الرمز التالي يأتي من string.swift في المكتبة القياسية:
سلسلة الهيكل العامة {public var _core: _stringCore}بالطبع هناك بعض إعدادات التهيئة الأخرى ، ولكن هناك فقط سمة التخزين هذه في الإعلان! يجب أن يكون السر في StringCore.swift:
الهيكل العام _stringCore {public var _baseaddress: unsafemutablerawpointer؟ var _countandflags: uint public var _owner: anyobject؟}هناك العديد من الأشياء الأخرى في هذا النوع ، لكننا نركز فقط على خصائص التخزين:
الموقف الحقيقي لـ _stringCore أكثر تعقيدًا مما هو مذكور هنا ، لكن المحتوى أعلاه يجعل من السهل فهم بعض المعلومات حول السلاسل: التخزين الداخلي وحجم الأوتار.
فرعية
كيفية إنشاء سلسلة فرعية في Swift؟ أسهل طريقة هي أخذ فقرة من String by Subcript:
دع str = "hello swift!" دع slice = str.startIndex .. <str index = "" str = "" startIndex = "" nbsp = "" offsetby: = "" 5 = "" hello = "" "> </str>
على الرغم من أنها بسيطة ، إلا أن الكود لا يبدو أنيقًا للغاية.
فهرس السلسلة ليس عددًا صحيحًا بديهيًا ، لذلك يجب الحصول على فهرس الموضع أثناء الاعتراض باستخدام startIndex والفهرس (_: OffsetBy :). إذا قمت بالاعتراض من موضع البداية للسلسلة ، فيمكنك حذف StartIndex:
اسمح withPartialRange = str [.. <str index = "" str = "" startIndex = "" nbsp = "" OffsetBy: = "" 5 = "" "
أو استخدم هذه الطريقة في المجموعة:
دع Slice = str.prefix (5) // لا يزال "مرحبًا"
تذكر أن السلاسل هي أيضًا مجموعات ، بحيث يمكنك استخدام الأساليب تحت المجموعات ، مثل البادئة () ، واللاحقة () ، و dropfirst () ، إلخ.
المبادئ الداخلية للفرعية
تسخين مكان سحري هو إعادة استخدام ذاكرة السلسلة الأصل. يمكنك فهم السلسلة الفرعية كواحدة من فقرات السلسلة الأصل.
على سبيل المثال ، إذا قمت بقطع 100 حرف من سلسلة أحرف 8000 ، فأنت لا تحتاج إلى إعادة تهيئة مساحة ذاكرة 100 حرف.
هذا يعني أيضًا أنه يمكنك تمديد دورة حياة الأصل بطريق الخطأ. إذا كانت هناك سلسلة كبيرة ، فأنت فقط اعتراض شريحة صغيرة ، طالما لم يتم إطلاق سلسلة القطاعات الصغيرة المقابلة ، فلن يتم إصدار سلسلة القطاع الكبيرة.
كيف يتم الانتهاء من السلسلة الفرعية؟
البنية العامة Substring {internal var _slice: rangereplacableBidirectionAlslice <string> </string>تحتوي السمة الداخلية _slice على جميع المعلومات حول السلسلة الأصل:
// لا يزال داخل SundringInternal var _wholestring: string {return _slice._base} public var startIndex: index {return _slice.startIndex} public var endindex: index {return _slice.endindex}حساب الخاصية _wholestring (إرجاع السلسلة الأصل بأكملها) ، يتم إرجاع startIndex و EndIndex من خلال _slice الداخلي.
يمكن أيضًا أن نرى كيف تشير الشريحة إلى السلسلة الأصل.
فرقة السلسلة إلى السلسلة
أخيرًا ، قد يكون هناك العديد من الفروع في الكود ، ولكن نوع المعلمة للوظيفة يتطلب سلسلة. عملية تحويل السلسلة الفرعية إلى السلسلة بسيطة للغاية أيضًا:
دع string = سلسلة (SUNDRING)
نظرًا لأن Sundrings تشترك في نفس مساحة الذاكرة مثل السلسلة الأم الخاصة بها ، فمن خمن أن إنشاء سلسلة جديدة يجب أن يهيئة مساحة تخزين جديدة. إذن ما هي عملية تهيئة السلسلة؟
تمديد سلسلة {public init (_ substring: substring) {// 1 دع x = substring._wholestring // 2 let start = substring.startIndex Let end = substring.endIndex // 3 let u16 = "if =" if = "e" في: = "" x = "" unicodescalars = "" end = "" self = "" 4b = "" else = ""> </end>خطوات تحويل السلسلة إلى سلسلة بسيطة للغاية ، ولكن قد ترغب في التفكير فيما إذا كنت بحاجة إلى القيام بذلك. هل تحتاج إلى أن يكون النوع ليكون سلسلة عند إجراء عمليات فرعية؟ إذا كانت جميع العمليات على السلسلة الفرعية تحتاج إلى تحويل إلى سلسلة ، فستفقد السلسلة الفرعية الخفيفة المعنى.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.