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:
get içerebilir ya da hem get hem de set içerebilir).Uygulama:
Ö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
Subscript inout tipinde bir parametre alabilir mi veya bir yapı içinde mutating olabilir mi?
Cevap:
inout olamaz.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 } } }
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ı.