مسیرها
/
Swift
Swift
/
تمرین‌ها
/
مغازه‌ی تابلوهای سفارشی Cal
مغازه‌ی تابلوهای سفارشی Cal

مغازه‌ی تابلوهای سفارشی Cal

تمرین یادگیری

مقدمه

یک رشته نماینده‌ی داده‌های متنی است. در 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 در framework Foundation پیوند می‌خورند و دسترسی به توانایی‌های گسترده‌ی پردازش متن را فراهم می‌کنند.

کاراکتر

یک Character نماینده‌ی یک «خوشه‌ی گرافیمی گسترده» است، یعنی کاراکتری خوانا برای انسان که از یک یا چند مقدار اسکالر یونیکد تشکیل شده است. یک مقدار اسکالر یونیکد، یک نقطه‌ی کد ۲۱بیتی در بازه‌ی 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 اپل مراجعه کنید.

ویژگی‌های کاراکتر

ویژگی‌های رایج کاراکتر عبارت‌اند از:

ویژگی توضیح مثال
isLowercase اگر کاراکتر حرف کوچک باشد، مقدار true را برمی‌گرداند نتیجه‌ی "a".isLowercase برابر true است
isUppercase اگر کاراکتر حرف بزرگ باشد، مقدار true را برمی‌گرداند نتیجه‌ی "A".isUppercase برابر true است
isNumber اگر کاراکتر یک رقم باشد، مقدار true را برمی‌گرداند نتیجه‌ی "1".isNumber برابر true است
isWhitespace اگر کاراکتر فضای خالی باشد، مقدار true را برمی‌گرداند نتیجه‌ی " ".isWhitespace برابر true است

برای فهرست کامل ویژگی‌ها، به مستندات Character اپل مراجعه کنید.

تبدیل نوع

می‌توانید انواع دیگر را با استفاده از سازنده‌ی 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 را می‌گیرد که رشته‌ای است و پیام تابلو را نگه می‌دارد. تابلو یک قیمت پایه‌ی ۲۰ در واحد پول داده‌شده دارد. به‌علاوه، هر حرف ۲ هزینه دارد (فاصله‌های خالی هم در محاسبه لحاظ می‌شوند). تابع باید هزینه‌ی تابلو را به‌صورت یک عدد صحیح برگرداند.

costOf(sign: "Happy Birthday Grandma!")
// returns 66
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Swift Exercism

آماده‌اید مغازه‌ی تابلوهای سفارشی Cal را شروع کنید؟

در Exercism ثبت‌نام کنید تا Swift را همراه با 35 مفهوم116 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.