배열은 순서대로 같은 타입의 값을 저장한다.
같은 값은 배열에 다른 순서로 존재할 수 있다.
Note:
Swift의 Array 타입은 Foundation의 NSArray 클래스와 연결된다.
Swift 배열의 타입은 저장할 배열 값의 타입을 나타내는 Array<Element>로 작성한다.
또한 짧게 [Element]로 작성할 수도 있다.
두 형식이 기능적으로 동일하지만 짧은 표현이 선호되며 배열 타입을 참조할 때 이 가이드 전체에서 사용된다.
초기화 구문을 사용하여 타입을 포함한 빈 배열을 생성할 수 있다.
var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
someInts 변수의 타입은 초기화 타입을 통해 [Int]로 추론된다.
또는 컨텍스트가 함수 인수 혹은 이미 타입이 명시된 변수 또는 상수와 같은 타입 정보를 제공하는 경우 []으로 빈 배열을 생성할 수 있다.
someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]
Swift의 Array 타입은 같은 기본 값으로 설정하고 크기를 고정하여 배열을 생성하는 초기화도 제공한다.
적합한 타입 (파라미터명 repeating)의 기본값과 새로운 배열에 반복될 값의 횟수 (파라미터명 count)를 초기화에 전달한다.
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
동등한 타입의 2개의 존재하는 배열을 + 연산자를 통해 합쳐서 새로운 배열을 생성할 수 있다.
새로운 배열의 타입은 합쳐진 2개의 배열으로부터 추론된다.
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
배열 콜렉션으로 하나 이상의 값을 작성하여 배열 리터럴 (array literal)로 배열을 생성할 수 있다.
배열 리터럴은 값을 리스트로 작성하고 콤마로 구분하며 대괄호로 둘러싸서 작성한다.
[<#value 1#>, <#value 2#>, <#value 3#>]
아래 예제는 String 값을 저장하는 shoppingList 배열을 생성하는 예이다.
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
shoppingList 변수는 [String]으로 쓰고 "문자열 값의 배열"로 선언된다.
이 배열은 String의 값 타입을 가지고 있기 때문에 String값만 저장이 가능하다.
여기서 shoppingList 배열은 배열 리터럴 안에 쓰여진 2개의 String 값 ("Eggs"와 "Milk")으로 초기화되었다.
Note:
아래 예제에서 쇼핑리스트에 더 많은 아이템이 추가되기 때문에 shoppingList 배열은 상수가 아닌 변수로 선언되었다.
이 경우 배열 리터럴은 2개의 String 값을 포함한다.
이것은 shoppingList 변수의 선언 타입 (String 값만 포함될 수 있는 배열)과 일치하므로 2개의 초기 항목으로 shoppingList를 초기화하는 방법으로 배열 리터럴의 할당이 허용된다.
Swift의 타입 추론 덕분에 같은 타입의 값을 포함하는 배열 리터럴로 초기화하면 배열의 타입을 명시할 필요가 없다.
shoppingList의 초기화는 아래와 같이 간단하게 작성할 수 있다.
var shoppingList = ["Eggs", "Milk"]
배열 리터럴 안에 모든 값은 같은 타입이기 때문에 Swift는 [String]가 shoppingList 변수를 사용하는 데 올바른 타입이라는 것을 유추할 수 있다.
메소드와 프로퍼티 또는 서브스크립트 구문을 사용하여 배열에 접근 및 수정이 가능하다.
배열의 아이템 갯수를 확인하려면 읽기 전용 count 프로퍼티로 확인할 수 있다.
print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."
부울 isEmpty 프로퍼티를 사용하여 배열의 count 프로퍼티 값이 0인지 아닌지 빠르게 판단할 수 있다.
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// Prints "The shopping list is not empty."
배열의 append(_:) 메소드를 호출하여 배열의 끝에 새로운 아이템을 추가할 수 있다.
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes
또한 하나 이상의 동등한 아이템의 배열은 덧셈 대입 연산자(+=)를 통해 추가할 수 있다.
shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
서브스크립트 구문을 사용하여 배열의 값을 가져올 수 있다.
배열의 이름 뒤에 바로 대괄호를 붙이고 가져올 값의 인덱스를 넣어 해당 값을 가져올 수 있다.
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"
서브스크립트 구문을 사용하여 존재하는 값을 변경할 수 있다.
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"
서브스크립트 구문을 사용할 때 인덱스는 유효해야 한다..
예를 들어 shoppingList[shoppingList.count] = "Salt"로 배열 끝에 추가하려고 하면 런타임 에러가 발생한다.
변경할 값들이 변경할 범위와 다른 길이를 가지고 있더라도 서브스크립트 구문으로 범위 안에 값을 한번에 변경할 수 있다.
아래 예제는 "Chocolate Spread", "Cheese"를 "Bananas"와 "Apples"로 대체한다.
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items
배열에 특정 인덱스를 추가하려면 배열의 insert(_:at:) 메소드를 호출한다.
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list
insert(_:at:) 메소드를 호출하면 인덱스가 0인 쇼핑 리스트 가장 맨 앞에 "Maple Syrup"의 값을 가진 새로운 아이템을 추가한다.
비슷하게 remove(at:) 메소드를 통해 배열의 아이템을 삭제할 수 있다.
이 메소드는 해당 인덱스의 아이템을 삭제하고 삭제한 아이템을 반환한다(반환된 값이 피룡 없으면 무시해도 된다.).
아이템이 삭제되면 배열의 공간도 삭제되므로 인덱스가 0인 값은 "Six eggs"와 같다.
firstItem = shoppingList[0]
// firstItem is now equal to "Six eggs"
배열의 마지막 아이템을 삭제하고 싶다면 배열의 count 프로퍼티의 사용을 피하기 위해 remove(at:) 메소드보다 removeLast() 메소드를 사용하는 것이 좋다.
remove(at:) 메소드와 같이 removeLast() 메소드는 삭제된 아이템을 반환한다.
let apples = shoppingList.removeLast()
// the last item in the array has just been removed
// shoppingList now contains 5 items, and no apples
// the apples constant is now equal to the removed "Apples" string
for-in 루프를 사용하여 배열의 전체 값을 알 수 있다.
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
각 아이템의 인덱스 뿐만 아니라 값도 필요하다면 enumerated() 메서드를 사용한다.
배열의 각 아이템에 대해 enumerated() 메서드는 정수와 아이템을 조합하여 튜플로 반환한다.
정수는 0부터 시작하여 각 아이템에 대해 1씩 증가한다.
전체 배열을 열거하는 경우 이 정수는 아이템의 인덱스와 일치한다.
튜플을 임시의 상수 또는 변수로 분해할 수도 있다.
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas