المسارات
/
Swift
Swift
/
التمارين
/
متجر كال للافتات المخصّصة
متجر كال للافتات المخصّصة

متجر كال للافتات المخصّصة

تمرين تعلّمي

مقدمة

تمثّل السلسلة النصية بيانات نصية. في 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 💖

التعليمات

في هذا التمرين، ستكتب كودًا يساعد شركة لافتات على إنشاء رسائل مخصصة للافتاتها.

1. أنشئ مجموعة من السلاسل النصية المفيدة

عرّف السلاسل النصية الثابتة التالية التي ستُستخدم لإنشاء اللافتات:

  • birthday: يحمل هذا الثابت القيمة "Birthday"
  • valentine: يحمل هذا الثابت القيمة "Valentine's Day"
  • anniversary: يحمل هذا الثابت السلسلة النصية "Anniversary"

2. أنشئ مجموعة من المحارف المفيدة

عرّف المحارف الثابتة التالية التي ستُستخدم لإنشاء اللافتات:

  • space: يحمل هذا الثابت القيمة " " (مسافة واحدة)
  • exclamation: يحمل هذا الثابت القيمة "!"

3. اجمع العبارات لبناء الرسائل

نفّذ الدالة buildSign(for:name:) التي تأخذ الوسيط for الذي يحمل إحدى السلاسل النصية الثلاث التي عرّفتها في المهمة الأولى، والوسيط name وهو سلسلة نصية تحمل اسم الشخص التي صُنعت اللافتة من أجله. استخدم دمج السلاسل النصية لبناء رسالة اللافتة، وتذكّر إعادة استخدام الثوابت المعرّفة مسبقًا. ينبغي أن تُرجع الدالة رسالة اللافتة كسلسلة نصية.

buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"

buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"

4. ابنِ لافتة تخرج

نفّذ الدالة graduationFor(name:year:) التي تأخذ الوسيط name وهو سلسلة نصية تحمل اسم الشخص التي صُنعت اللافتة من أجله، والوسيط year وهو عدد صحيح يحمل السنة التي يتخرّج فيها الشخص. استخدم القوالب النصية لبناء رسالة اللافتة. ينبغي أن تُرجع الدالة رسالة اللافتة كسلسلة نصية.

graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"

5. احسب تكلفة اللافتة

نفّذ الدالة costOf(sign:) التي تأخذ الوسيط sign وهو سلسلة نصية تحمل رسالة اللافتة. للافتة سعر أساسي قدره 20 في العملة المحددة. بالإضافة إلى ذلك، يكلّف كل حرف 2 (تُحتسب المسافات البيضاء ضمن الحساب). ينبغي أن تُرجع الدالة تكلفة اللافتة كعدد صحيح.

costOf(sign: "Happy Birthday Grandma!")
// returns 66
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Swift Exercism

مستعد لبدء متجر كال للافتات المخصّصة؟

سجّل في Exercism لتتعلّم وتتقن Swift عبر 35 مفهومًا116 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.