Menu
Coddy logo textTech

בקרת גישה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 17 מתוך 57.

כימוס פירושו שסוג שולט באופן שבו ניתן להשתמש בנתונים שלו. בקרת גישה קובעת מי יכול לראות מאפיין או מתודה. סימון איבר בתור private מסתיר אותו מכל הקוד שמחוץ לסוג (ומההרחבות שלו באותו קובץ):

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}

var a = Account()
a.deposit(50)
// a.balance = 1_000_000   // שגיאה: לא ניתן לגשת ל-'balance' בגלל רמת ההגנה 'private'

מחוץ לקוד אפשר להשתמש רק במה שהטיפוס מציע. הטיפוס יכול לבדוק כל שינוי, כך שהנתונים שלו לעולם לא יגיעו למצב שהטיפוס אינו מאפשר:

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        if amount > 0 { balance += amount }
    }

    func report() -> String {
        "balance: \(balance)"
    }
}

var a = Account()
a.deposit(50)
a.deposit(-999)
print(a.report())

פלט:

balance: 50

ל-Swift יש חמש רמות גישה. ללא מילת מפתח, חבר הוא internal: גלוי בכל מקום באותו מודול (האפליקציה או החבילה שלך). הרמות מהפתוחה ביותר למוגבלת ביותר:

open        // מודולים אחרים יכולים להשתמש בו וליצור ממנו תת־מחלקות (מחלקות בלבד)
public      // מודולים אחרים יכולים להשתמש בו
internal    // ברירת מחדל: המודול כולו
fileprivate // קובץ המקור הזה בלבד
private     // הטיפוס הזה (וההרחבות שלו בקובץ)

שיטות עזר פרטיות מצמצמות את הממשק הציבורי: הקוראים רואים מה הטיפוס עושה, ולא איך הוא עושה זאת.

struct Password {
    private let text: String

    init(_ text: String) { self.text = text }

    var isStrong: Bool {
        hasDigit() && text.count >= 8
    }

    private func hasDigit() -> Bool {
        text.contains { $0.isNumber }
    }
}

print(Password("secret123").isStrong)
print(Password("short1").isStrong)

פלט:

true
false
challenge icon

אתגר

קל

השלם את המבנה Locker. השדות code ו־items שלו הם private. הפעולה store(_:code:) מוסיפה פריט רק כאשר הקוד תואם, ומחזירה אם הפעולה הצליחה; הפעולה items(code:) מחזירה את הפריטים המאוחסנים כשהם מחוברים באמצעות , (או empty) כאשר הקוד תואם, ואת wrong code אחרת.

הקוד שסופק קורא את קוד המנעול, ולאחר מכן פקודות מהצורה put <code> <item> או open <code>. הוא מדפיס stored או denied עבור כל פקודת put, ואת התוצאה עבור כל פקודת open.

הקוד שלך צריך להופיע ב־Locker.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
var locker = Locker(code: input[0])
for cmd in input.dropFirst() {
    let p = cmd.split(separator: " ").map(String.init)
    if p[0] == "put" {
        print(locker.store(p[2], code: p[1]) ? "stored" : "denied")
    } else {
        print(locker.items(code: p[1]))
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Swift אונליין