ProgramlamaiOS Geliştirici

Swift'te Subscripts ile çalışmanın özelliklerini açıklayın. Subscript için hangi kısıtlamalar vardır, bu mekanizma nasıl genişletilebilir ve nerelerde kullanılmalıdır? Alışılagelmedik bir subscript örneği verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Subscripts Swift'te, kendi türlerinize bağlı olarak anahtar veya indeks ile tip değerlerine ulaşım sağlamak için dizi veya sözlüklerde olduğu gibi kullanılan bir mekanizmadır. Söz dizimi bir işlev gibi görünür, ancak erişim köşeli parantezlerle yapılır: object[key].

Özellikler:

  • Bir sınıf veya yapı birden fazla subscript'e sahip olabilir (parametreler üzerinden aşırı yükleme).
  • Subscript read-only veya read-write olabilir (yalnızca get içerebilir ya da hem get hem de set içerebilir).
  • Subscript, herhangi bir sayıda parametre ve tip alabilir (örneğin, iki indeks).
  • Variadic parametreler desteklenmez.

Uygulama:

  • Koleksiyonlara, matrislere, özel nesnelere, serileştirilebilir değerlere vb. erişimi kolaylaştırmak için kullanılır.

Örnek: İki boyutlu bir dizi (matris) ve iki parametreli subscript:

struct Matrix { let rows: Int, columns: Int private var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0, count: rows * columns) } subscript(row: Int, column: Int) -> Double { get { precondition(isValid(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { precondition(isValid(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } private func isValid(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } } var matrix = Matrix(rows: 2, columns: 2) matrix[0,1] = 5.0 print(matrix[0,1]) // 5.0

Kandırmaca Soru

Subscript inout tipinde bir parametre alabilir mi veya bir yapı içinde mutating olabilir mi?

Cevap:

  • Subscript parametresi inout olamaz.
  • Değer tipi (struct/enum) içindeki subscript, mutating set olarak tanımlanabilir, bu da set içinde self'i değiştirmeyi sağlar:
struct Counter { var value: Int = 0 subscript(increment: Bool) -> Int { mutating get { value += increment ? 1 : -1 return value } } }

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Özel bir koleksiyonda, yapı içindeki subscript'in set'ini mutating yapmayı unuttular, bu nedenle subscript aracılığıyla bir öğeyi değiştirmeye çalışmak derleme hatasına neden oluyordu. Hata, uzun bir hata ayıklama sürecinin ardından koleksiyonun entegrasyonu sırasında ortaya çıktı.


Hikaye

Özel bir subscript'te, indeks dışına çıkmayı doğru bir şekilde işlemek için bir uygulama yapılmadığı için, aralığın dışına erişim sırasında çöküşler meydana geldi. Sonuç olarak, iş açısından kritik olan veri işleme işlevleri başarısız oldu.


Hikaye

Önbellekleme amaçlı bir enum için iki parametreli bir subscript uygulandı, ancak subscript'in sadece örnek üzerinde olabileceği, tür üzerinde static olamayacağı göz önünde bulundurulmadı. Mimarî çözüm hatalı çıktı, koleksiyonun API etkileşimini yeniden yazmak zorunda kaldı.