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"
스위프트는 대체품이 없습니다.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 자체 문서에서:
집합의 변이성
배열, 집합 또는 사전을 생성하고 변수에 할당하면 생성되는 집합이 변경 가능합니다.즉, 컬렉션에서 항목을 추가, 제거 또는 변경하여 컬렉션을 만든 후 해당 컬렉션을 변경(또는 변경)할 수 있습니다.반대로 배열, 집합 또는 사전을 상수에 할당하는 경우 해당 컬렉션은 불변하며 크기와 내용은 변경할 수 없습니다.
그 밖에 불변/가변 컬렉션의 용도는 해당 컬렉션을 가변/가변으로 변경하려는 이유에 따라 달라집니다.컬렉션은 Swift에서 value type으로, 내용이 다른 값에 할당되거나 다른 기능/메소드로 전달될 때 복사되는 것을 의미합니다.따라서 수신 메서드 함수가 원래 배열을 변경할 수 있는지 여부에 대해 걱정할 필요가 없습니다.예를 들어 클래스에 가변 컬렉션이 있는 경우에는 불변 컬렉션을 반환해야 할 필요가 없습니다.
스위프트 변동 가능/불변 컬렉션
스위프트의 배열을 음소거할 수 있습니다.
불변 컬렉션[대략] - 변경할 수 없는 컬렉션 구조입니다.생성 후 추가, 제거, 수정할 수 없음을 의미합니다.
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
'programing' 카테고리의 다른 글
오라클 시퀀스 트리거 생성 (0) | 2023.10.10 |
---|---|
표준 브라우저 가상 머신이 아닌 자바스크립트를 사용하는 이유는 무엇입니까? (0) | 2023.10.10 |
jQuery-UI의 자동 완성이 잘 표시되지 않음, z-index 문제 (0) | 2023.10.10 |
mysql 레코드 생성 타임스탬프 자동 저장 (0) | 2023.10.10 |
내용 길이에 따라 크기를 조정할 텍스트 영역 (0) | 2023.10.10 |