[ios] Swift의 불변 / 변형 컬렉션

저는 Swift 언어로 Mutable / immutable 객체 (Array, Dictionary, Sets, Data)의 생성을 이해하기 위해 Apple의 Swift 프로그래밍 가이드를 참조했습니다. 하지만 Swift에서 변경 불가능한 컬렉션을 만드는 방법을 이해할 수 없었습니다.

Objective-C에서 다음과 같은 Swift의 등가물을보고 싶습니다.

불변 배열

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에 대한 추가 정보


답변

Swift는 대체품이 없습니다. NSArray Objective-C의 다른 컬렉션 클래스를 .

배열 및 사전 클래스가 있지만 “객체”유형 인 NSArray 및 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"]

당신은 달성 할 수 있습니다 NSMutableArrayinout메소드 매개 변수 를 사용하여의 동작을 .

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

.NET에서도 동일하게 작동합니다 let.


답변

Apple의 자체 문서에서 :

컬렉션의 가변성

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

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

변경 불가능 / 변경 불가능 컬렉션의 다른 용도는 변경 가능 / 불변 콜렉션을 원하는 이유에 따라 다릅니다. 컬렉션은 Swift의 유형입니다. 즉, 다른 값에 할당되거나 다른 함수 / 메서드에 전달 될 때 내용이 복사됩니다. 따라서 수신 메서드 함수가 원래 배열을 변경할 수 있는지 여부에 대해 걱정할 필요가 없습니다. 따라서 예를 들어 클래스가 변경 가능한 컬렉션을 보유하고있는 경우 변경 불가능한 컬렉션을 반환 할 필요가 없습니다.


답변

[수정 불가 및 불변]

Swift의 배열을 음소거 할 수 있습니다.

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

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

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배열입니다