Published on

Swift Advanced: Subscripts qanday ishlaydi va ular nima?

Authors

Subscript o'zi nima?

Kundalik kodlash jarayonida siz massivlar (array) bilan juda ko'p ishlaysiz va uning ichidagi elementni olish uchun quyidagicha kod yozasiz:

let array = ["Bir", "Ikki", "Uch"]
let firstItem = array[0] // "Bir"

Lekin hech o'ylab ko'rganmisiz, nima uchun aynan [0] (kvadrat qavslar) ishlashini? Bu qandaydir "sehr" emas. Bu Subscript deb ataluvchi Swift'dagi maxsus funksiya (yoki shortcut) hisoblanadi. Aslida yuqoridagi amaliyot arka planda quyidagiga o'xshash kodni chaqiradi:

// Pseudo kod
array.subscript(index: 0) -> Element

O'zimizning Subscript yaratamiz!

Biz extension lar yordamida massivga yoki o'zimiz yaratgan struct larga o'zimizning qulay subscript larimizni qo'shishimiz mumkin.

1-Misol: Massiv (Array) uchun yangi Subscript

Aytaylik, qidirayotgan nomimizni bersak, o'sha qiymatni topib beradigan (agar bo'lsa) yordamchi subscript yaratmoqchimiz.

extension Array where Element == String {

    // Subscript shunday yoziladi:
    subscript(value: String) -> String? {
        // Elementlar ichidan birinchi bo'lib mos kelganini qaytarish
        return self.first(where: { $0 == value })
    }
}

Endi kodimizda buni ishlatish juda qiziq:

let names = ["Ali", "Vali", "Gani"]

// Biz endi index bilan emas, qavs ichiga to'g'ridan-to'g'ri String yozib ishlatamiz:
let topilganIsm = names["Vali"]
// Natija: Optional("Vali")

2-Misol: Struct uchun Subscript

Ko'pincha murakkab ma'lumotlar bilan ishlaganda, ichki (nested) o'zgaruvchilarni tezroq o'qish uchun subscript yozish juda qo'l keladi.

struct Customer {
    let name: String
    let address: String

    // Subscript yaratamiz
    subscript(key: String) -> String? {
        switch key {
        case "name":
            return name
        case "address":
            return address
        default:
            return nil
        }
    }
}

Buni ishlashini ko'ring:

let user = Customer(name: "Nick", address: "Main Street")

// Avvalgi odatiy usul:
let userName = user.name

// Subscript usuli:
let userName2 = user["name"]
let userAddress = user["address"]

Garchi funksionallik bir xil bo'lsa-da, ba'zi loyihalarda (Dictionary dagi kabi) ma'lumotlarga moslashuvchan murojaat qilish kerak bo'lganda bu juda qulay yechimdir.

Eslatma: Subscriptlarni haddan tashqari ko'p joyda ishlatish kodingizni boshqa dasturchilar uchun tushunarsiz qilib qo'yishi mumkin. Ularni faqat haqiqatan ham qisqartma (shortcut) mantiqan mos kelgan holatlardagina ishlating.

Buy mea coffee