تمثّل السلسلة النصية بيانات نصية.
في Swift، السلسلة String هي مجموعة مرتّبة من قيم Character، حيث يمثّل كل محرف منها محرفًا يونيكوديًا واحدًا.
تنشئ سلسلة نصية باستخدام قيمة حرفية نصية، وهي متتالية من المحارف محاطة بعلامتي اقتباس مزدوجتين (").
أما السلاسل النصية الممتدة على عدة أسطر، فاستخدم ثلاث علامات اقتباس مزدوجة ("""):
let hello: String = "Hello, World!"
let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""
تتواصل السلاسل النصية في Swift بسلاسة مع صنف NSString في إطار عمل Foundation، مما يتيح الوصول إلى قدرات واسعة لمعالجة النصوص.
يمثّل Character عنقودًا رسوميًا موسّعًا واحدًا، أي محرفًا يمكن للإنسان قراءته ويتكوّن من قيمة واحدة أو أكثر من قيم يونيكود العددية.
وقيمة يونيكود العددية هي نقطة ترميز من 21 بت في النطاق من U+0000 إلى U+D7FF شاملًا الطرفين، أو من U+E000 إلى U+10FFFF شاملًا الطرفين.
let aChar: Character = "A"
عندما تكتب قيمة حرفية نصية، يستنتج Swift نوعها تلقائيًا على أنه String.
ولتخزين محرف واحد على هيئة Character، عليك تقديم تعليق نوع صريح:
let aString = "A" // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar)) // Prints Character
// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'
يمكنك ضمّ السلاسل النصية بعضها إلى بعض باستخدام عامل الجمع (+):
print("honey" + "comb")
// Prints "honeycomb"
لا يمكنك دمج Character مباشرةً مع String باستخدام + دون تحويل المحرف إلى سلسلة نصية أولًا.
لكن يمكنك استخدام طريقة append(_:) لإضافة سلسلة نصية أو محرف مباشرةً إلى سلسلة نصية قابلة للتغيير:
var greeting = "Hello"
let world = ", world"
let period: Character = "."
greeting.append(world)
print(greeting) // Prints "Hello, world"
greeting.append(period)
print(greeting) // Prints "Hello, world."
يتيح لك تداخل السلاسل النصية بناء سلسلة نصية عبر تضمين الثوابت والمتغيرات والقيم الحرفية والتعبيرات داخل القيم الحرفية النصية.
ضع كل تعبير بين قوسين هلاليين مسبوقين بشرطة مائلة عكسية (\( ... )):
let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"
توفّر السلاسل النصية والمحارف عدة خصائص لفحص محتواها.
من الخصائص الشائعة للسلاسل النصية:
| الخاصية | الوصف | مثال |
|---|---|---|
isEmpty |
تُرجع true إذا لم تحتوِ السلسلة النصية على أي محارف |
قيمتها "Hello".isEmpty هي false
|
count |
تُرجع عدد المحارف في السلسلة النصية | قيمتها "Hello".count هي 5
|
للاطلاع على قائمة كاملة بالخصائص، راجع توثيق String في Apple.
من الخصائص الشائعة للمحارف:
| الخاصية | الوصف | مثال |
|---|---|---|
isLowercase |
تُرجع true إذا كان المحرف صغيرًا |
قيمتها "a".isLowercase هي true
|
isUppercase |
تُرجع true إذا كان المحرف كبيرًا |
قيمتها "A".isUppercase هي true
|
isNumber |
تُرجع true إذا كان المحرف رقمًا |
قيمتها "1".isNumber هي true
|
isWhitespace |
تُرجع true إذا كان المحرف مسافة بيضاء |
قيمتها " ".isWhitespace هي true
|
للاطلاع على قائمة كاملة بالخصائص، راجع توثيق Character في Apple.
يمكنك تحويل أنواع أخرى إلى سلاسل نصية باستخدام مُهيّئ String(_:)، الذي يدعم أنواعًا قياسية مثل Int وDouble وCharacter:
let charX: Character = "x"
print(String(charX)) // Prints "x"
print(String(110)) // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"
تدعم القيم الحرفية النصية في Swift عدة متتاليات هروب للمحارف الخاصة:
| المتتالية | الوصف |
|---|---|
\0 |
محرف فارغ |
\\ |
شرطة مائلة عكسية |
\t |
علامة جدولة أفقية |
\n |
تغذية سطر (سطر جديد) |
\r |
إرجاع المؤشر |
\' |
علامة اقتباس مفردة |
\" |
علامة اقتباس مزدوجة |
\u{n} |
قيمة يونيكود عددية اعتباطية (بالنظام الست عشري) |
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.
let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖
في هذا التمرين، ستكتب كودًا يساعد شركة لافتات على إنشاء رسائل مخصصة للافتاتها.
عرّف السلاسل النصية الثابتة التالية التي ستُستخدم لإنشاء اللافتات:
birthday: يحمل هذا الثابت القيمة "Birthday"valentine: يحمل هذا الثابت القيمة "Valentine's Day"anniversary: يحمل هذا الثابت السلسلة النصية "Anniversary"عرّف المحارف الثابتة التالية التي ستُستخدم لإنشاء اللافتات:
space: يحمل هذا الثابت القيمة " " (مسافة واحدة)exclamation: يحمل هذا الثابت القيمة "!"نفّذ الدالة buildSign(for:name:) التي تأخذ الوسيط for الذي يحمل إحدى السلاسل النصية الثلاث التي عرّفتها في المهمة الأولى، والوسيط name وهو سلسلة نصية تحمل اسم الشخص التي صُنعت اللافتة من أجله.
استخدم دمج السلاسل النصية لبناء رسالة اللافتة، وتذكّر إعادة استخدام الثوابت المعرّفة مسبقًا.
ينبغي أن تُرجع الدالة رسالة اللافتة كسلسلة نصية.
buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"
buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"
نفّذ الدالة graduationFor(name:year:) التي تأخذ الوسيط name وهو سلسلة نصية تحمل اسم الشخص التي صُنعت اللافتة من أجله، والوسيط year وهو عدد صحيح يحمل السنة التي يتخرّج فيها الشخص.
استخدم القوالب النصية لبناء رسالة اللافتة.
ينبغي أن تُرجع الدالة رسالة اللافتة كسلسلة نصية.
graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"
نفّذ الدالة costOf(sign:) التي تأخذ الوسيط sign وهو سلسلة نصية تحمل رسالة اللافتة.
للافتة سعر أساسي قدره 20 في العملة المحددة. بالإضافة إلى ذلك، يكلّف كل حرف 2 (تُحتسب المسافات البيضاء ضمن الحساب).
ينبغي أن تُرجع الدالة تكلفة اللافتة كعدد صحيح.
costOf(sign: "Happy Birthday Grandma!")
// returns 66
سجّل في Exercism لتتعلّم وتتقن Swift عبر 35 مفهومًا116 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.