VÝUKATMAI
SEMINÁŘ 01

Úvod do jazyka Swift

MATERIÁLY K SEMINÁŘI
Prezentace Swift REPL
ÚKOLY

Vyřešené úkoly budou zkontrolovány na semináři.

1. Skladový systém

Naprogramuj jednoduchý systém skladu se skladovými položkami a operacemi příjmu/výdeje.

POŽADAVKY
  1. Vytvoř enum StockOperationType: inbound (příjem), outbound (výdej).
  2. Vytvoř struct StockItem: sku: String (unikátní kód, např. „A123“), name: String, quantity: Int.
  3. Vytvoř struct StockOperation: type: StockOperationType, sku: String, amount: Int, date: Date.
  4. Vytvoř class Warehouse s vlastnostmi var items: [StockItem], var history: [StockOperation] a metodami:
    • func addNewItem(_ item: StockItem) (nesmí vložit duplicitní sku)
    • func apply(_ operation: StockOperation) -> Bool (vrací true, pokud proběhla; false, pokud nešla provést)
  5. Pravidla pro apply: amount musí být > 0. U inbound — existuje-li položka, zvýší se quantity, jinak se vytvoří nová s quantity = amount. U outbound — položka musí existovat a nesmí jít pod nulu (jinak se operace neprovede).
  6. Napiš funkce:
    • func item(with sku: String) -> StockItem?
    • func totalQuantity() -> Int
    • func lowStockItems(threshold: Int) -> [StockItem] (např. <= 3)

Přidej ke StockItem computed property isLowStock: Bool (např. quantity <= 3) a využij ji v lowStockItems.

BONUS
  • func mostMovedItem() -> StockItem? (podle součtu pohybů v historii)
  • func printReport() (hezký výpis do konzole)

Poznámka: Nejsou povoleny funkce map, filter, reduce. Použij for-in a podmínky.

2. Výpůjční systém knihovny

Naprogramuj zjednodušenou evidenci knih a výpůjček se stavem a penalizací za pozdní vrácení.

POŽADAVKY
  1. Vytvoř struct Book: isbn: String, title: String.
  2. Vytvoř struct Member: id: UUID, name: String.
  3. Vytvoř struct Loan: isbn: String, memberId: UUID, dueDate: Date, returnDate: Date? — přidej computed property isOverdue: Bool.
  4. Vytvoř class Library s var books: [Book] a var loans: [Loan] a metodami:
    • func isAvailable(isbn: String) -> Bool (kniha je dostupná, pokud nemá aktivní nevrácenou výpůjčku)
    • func borrow(isbn: String, by member: UUID) -> Bool (selže, není-li kniha dostupná)
    • func returnBook(isbn: String) -> Bool (nastaví returnDate na aktivní výpůjčce)
  5. Napiš func penalty(for loan: Loan) -> Double, která spočítá penále jako počet dní po termínu krát pevná sazba (např. 5 Kč/den).
BONUS
  • func overdueLoans() -> [Loan] — přehled aktuálně po termínu.

Poznámka: Nejsou povoleny funkce map, filter, reduce. Použij for-in a podmínky.