programing

Swift의 불변/가변 컬렉션

minimums 2023. 10. 10. 20:11
반응형

Swift의 불변/가변 컬렉션

저는 Apple의 Swift 프로그래밍 가이드를 참조하여 변이 가능/불변 개체(Array, Dictionary, Sets, Data)를 스위프트 언어로 작성하는 것을 이해하고 있었습니다.하지만 스위프트에서 불변의 컬렉션을 만드는 방법을 이해할 수 없었습니다.

목표-C의 아래 사항에 대해 스위프트에서 동등한 것을 보고 싶습니다.

불변 배열

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];

가변 배열

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];

불변 사전

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];

변이 가능 사전

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];

배열

불변 배열 생성

첫번째 방법:

let array = NSArray(array: ["First","Second","Third"])

두번째 방법:

let array = ["First","Second","Third"]

가변 배열 만들기

var array = ["First","Second","Third"]

배열에 개체 추가

array.append("Forth")


사전

불변 사전생성

let dictionary = ["Item 1": "description", "Item 2": "description"]

가변 사전 만들기

var dictionary = ["Item 1": "description", "Item 2": "description"]

사전에 새 쌍 추가

dictionary["Item 3"] = "description"

Apple Developer에 대한 자세한 정보

스위프트는 대체품이 없습니다.NSArray또는 목표-C의 다른 수집 클래스.

배열 클래스와 사전 클래스가 있지만 "객체" 유형인 NSray 및 NSDictionary와 비교하여 이러한 클래스는 "값" 유형임에 유의해야 합니다.

차이점은 미묘하지만 엣지 케이스 버그를 방지하는 데 매우 중요할 수 있습니다.

신속하게 다음과 같은 "불변" 배열을 만듭니다.

let hello = ["a", "b", "c"]

"돌연변이" 배열은 다음과 같습니다.

var hello = ["a", "b", "c"]

변형 가능한 배열은 다음과 같이 수정할 수 있습니다.NSMutableArray:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

그러나 가변 배열을 함수에 전달할 수는 없습니다.

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

그러나 위 코드는 NSMutableArray에서 작동합니다.

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

달성할 수 있습니다.NSMutableArray의 행동을 사용자의 행동inout메서드 매개 변수:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

현재 Swift의 행동을 반영하기 위해 이 답변 2015-08-10을 다시 작성했습니다.

하나밖에 없습니다.Array그리고 하나Dictionary스위프트를 입력합니다.변이성은 구성 방법에 따라 달라집니다.

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

즉, 변수에 할당을 생성하면 변경할 수 있는 반면 상수에 할당을 생성하면 변경할 수 없습니다.

경고: 불변 배열이 완전히 불변은 아닙니다!전체 길이가 아니라 내용물을 변경할 수도 있습니다.

개체 또는 변수를 다음과 같이 선언합니다.

'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.

그리고.

'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 

자세한 내용은

"상수를 만들려면 let을 사용하고 변수를 만들려면 var를 사용합니다.컴파일 시에 상수 값을 알 필요는 없지만 한 번만 값을 할당해야 합니다.즉, 상수를 사용하여 한 번 결정하지만 여러 곳에서 사용하는 값의 이름을 지정할 수 있습니다."

var myVariable = 42
myVariable = 50
let myConstant = 42

"The Swift Programming Language"를 읽어보세요.

Array (Swift)와NSArray를 할 수 .예:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

은 에도 합니다.let.

Apple 자체 문서에서:

집합의 변이성

배열, 집합 또는 사전을 생성하고 변수에 할당하면 생성되는 집합이 변경 가능합니다.즉, 컬렉션에서 항목을 추가, 제거 또는 변경하여 컬렉션을 만든 후 해당 컬렉션을 변경(또는 변경)할 수 있습니다.반대로 배열, 집합 또는 사전을 상수에 할당하는 경우 해당 컬렉션은 불변하며 크기와 내용은 변경할 수 없습니다.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html #//apple_ref/doc/uid/TP40014097-CH8-ID105

그 밖에 불변/가변 컬렉션의 용도는 해당 컬렉션을 가변/가변으로 변경하려는 이유에 따라 달라집니다.컬렉션은 Swift에서 value type으로, 내용이 다른 값에 할당되거나 다른 기능/메소드로 전달될 때 복사되는 것을 의미합니다.따라서 수신 메서드 함수가 원래 배열을 변경할 수 있는지 여부에 대해 걱정할 필요가 없습니다.예를 들어 클래스에 가변 컬렉션이 있는 경우에는 불변 컬렉션을 반환해야 할 필요가 없습니다.

스위프트 변동 가능/불변 컬렉션

[수정불가, 불변]

스위프트의 배열을 음소거할 수 있습니다.

[let vs var, 값 vs 참조 유형]

불변 컬렉션[대략] - 변경할 수 없는 컬렉션 구조입니다.생성 후 추가, 제거, 수정할 수 없음을 의미합니다.

let + struct(라이크)Array,Set,Dictionary) 에 더 합니다.

( :NSArray) 내부 상태를 변경할 수 있는 인터페이스를 제공하지 않습니다.

그렇지만

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)
}   

가 .unmodifiable배열하다

언급URL : https://stackoverflow.com/questions/24096096/immutable-mutable-collections-in-swift

반응형