Saya mengacu pada panduan pemrograman Swift Apple untuk memahami pembuatan objek yang dapat diubah / tidak dapat diubah (Array, Dictionary, Sets, Data) dalam bahasa Swift. Tapi saya tidak mengerti cara membuat koleksi yang tidak bisa diubah di Swift.
Saya ingin melihat padanan di Swift untuk yang berikut di Objective-C
Array yang Tidak Dapat Diubah
NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Array yang Dapat Diubah
NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Kamus yang Tidak Dapat Diubah
NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Kamus yang Dapat Diubah
NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
ios
objective-c
swift
immutability
mutable
Pranav Jaiswal
sumber
sumber
Dictionary
dapat diubah benar-benar tidak dapat diubah (berlawanan dengan Array)var
.Swift tidak memiliki penurunan apa pun sebagai pengganti
NSArray
atau kelas koleksi lainnya di Objective-C.Ada kelas array dan kamus, tetapi perlu dicatat ini adalah tipe "nilai", dibandingkan dengan NSArray dan NSDictionary yang merupakan tipe "objek".
Perbedaannya tidak kentara tetapi bisa sangat penting untuk menghindari bug kasus tepi.
Dengan cepat, Anda membuat larik "tidak berubah" dengan:
let hello = ["a", "b", "c"]
Dan array "bisa berubah" dengan:
var hello = ["a", "b", "c"]
Array yang dapat berubah dapat dimodifikasi seperti
NSMutableArray
:var myArray = ["a", "b", "c"] myArray.append("d") // ["a", "b", "c", "d"]
Namun Anda tidak bisa meneruskan array yang bisa berubah ke suatu fungsi:
var myArray = ["a", "b", "c"] func addToArray(myArray: [String]) { myArray.append("d") // compile error }
Tetapi kode di atas berfungsi dengan NSMutableArray:
var myArray = ["a", "b", "c"] as NSMutableArray func addToArray(myArray: NSMutableArray) { myArray.addObject("d") } addToArray(myArray) myArray // ["a", "b", "c", "d"]
Anda dapat mencapai
NSMutableArray
perilaku dengan menggunakaninout
parameter metode:var myArray = ["a", "b", "c"] func addToArray(inout myArray: [String]) { myArray.append("d") } addToArray(&myArray) myArray // ["a", "b", "c", "d"]
Tulis ulang jawaban ini 2015-08-10 untuk mencerminkan perilaku Swift saat ini.
sumber
Hanya ada satu
Array
dan satuDictionary
tipe di Swift. Mutabilitas tergantung pada bagaimana Anda membangunnya:var mutableArray = [1,2,3] let immutableArray = [1,2,3]
yaitu jika Anda membuat sebuah assign ke variabel itu bisa berubah, sedangkan jika Anda membuat assign ke konstan itu tidak.
PERINGATAN: Array yang tidak dapat diubah tidak sepenuhnya tidak dapat diubah! Anda masih dapat mengubah isinya, hanya saja tidak panjangnya secara keseluruhan!
sumber
Cukup nyatakan objek atau variabel Anda (apa saja) dengan
'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.
dan
'var' key word -> for "Mutable" array, dictionary, variable, object..etc.
Untuk informasi lebih dalam
var myVariable = 42 myVariable = 50 let myConstant = 42
Baca “Bahasa Pemrograman Swift.”
sumber
Jika Anda ingin menggunakan
Array
(Swift) sebagai denganNSArray
, Anda dapat menggunakan fungsi jembatan sederhana. Contoh:var arr1 : Array = [] arr1.bridgeToObjectiveC().count
Ini bekerja sama untuk
let
.sumber
Dari dokumen Apple sendiri:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105
Penggunaan lain dari koleksi yang tidak dapat diubah / dapat diubah bergantung pada mengapa Anda ingin koleksi tersebut dapat diubah / tidak dapat diubah. Koleksi adalah tipe nilai di Swift, yang berarti isinya disalin ketika ditetapkan ke nilai lain, atau diteruskan ke fungsi / metode lain. Oleh karena itu, Anda tidak perlu khawatir tentang apakah fungsi metode penerima dapat mengubah larik asli. Oleh karena itu, Anda tidak perlu memastikan untuk mengembalikan koleksi yang tidak dapat diubah jika kelas Anda memiliki koleksi yang bisa berubah, misalnya.
sumber
[Tidak Dapat Dimodifikasi dan Tidak Dapat Diubah]
Array Swift bisa dibungkam
[let vs var, Nilai vs Jenis Referensi]
Koleksi yang tidak dapat diubah [Tentang] yang tidak dapat diubah - adalah struktur koleksi yang tidak dapat diubah. Artinya Anda tidak dapat menambah, menghapus, memodifikasi setelah pembuatan
let + struct
(sepertiArray
,Set
,Dictionary
) lebih cocok untuk menjadi abadiAda beberapa kelas (mis
NSArray
) yang tidak menyediakan antarmuka untuk mengubah keadaan bagian dalamtapi
class A { var value = "a" } func testMutability() { //given let a = A() let immutableArr1 = NSArray(array: [a]) let immutableArr2 = [a] //when a.value = "aa" //then XCTAssertEqual("aa", (immutableArr1[0] as! A).value) XCTAssertEqual("aa", immutableArr2[0].value) }
Ini lebih suka
unmodifiable
arraysumber