Swift가 제공하는 컬렉션 타입 중 key와 value로 묶어서 구성할 수 있는 딕셔너리와, typealias, for in, sorted 등의 메서드 활용하기
딕셔너리(Dictionary) 사용
딕셔너리 는 컬렉션 타입으로, 키와 값 쌍으로 구성된다. 딕셔너리 안에는 키가 하나이거나 여러 개일 수 있다. Dictionary 키워드를 키의 타입과 값의 타입 이름의 조합으로 써서 생성한다.
// 기본적인 빈 딕셔너리 생성 (Int)
// var을 사용하여 딕셔너리가 변경 가능하게 하거나, let을 사용하여 변경 불가능한 딕셔너리로 생성
var userList: Dictionary<String, Int> = Dictionary<String, Int>()
let userList: Dictionary<String, Int> = Dictionary<String, Int>()
// 다음과 같이 초깃값을 부여할 수 있음
let userList: Dictionary<String, Int>
= ["user1": 1, "user2": 2,"user3": 3]
// 다음과 같이 작성도 가능
let userList: [String: Int]
= ["user1": 1, "user2": 2,"user3": 3]
print(userList["user1"]) // 결과 : Optional(1)
print(userList.count) // 결과 : 3
typealias라는 별칭 키워드는 이미 존재하는 데이터 타입에 임의로 다른 이름을 부여하여 사용할 수 있게 해준다.
이 기능을 사용하여 보다 간결하게 딕셔너리를 생성할 수 있다.
// 이미 존재하는 데이터 타입에 임의로 다른 이름을 부여
typealias StringDict = [String: Int]
// 빈 딕셔너리 생성
var userList: StringDict = [:]
// 딕셔너리 초깃값 부여
var userList: StringDict = ["user1": 1, "user2": 2,"user3": 3]
print(userList["user1"]) // 결과 : Optional(1)
딕셔너리의 키는 각각의 값에 접근할 수 있게 도와준다. 딕셔너리 내부에서 키는 유일해야 하며, 값은 유일하지 않다.
만약 딕셔너리 내부에 존재하지 않는 키로 접근하게 되면 nil
을 출력하게 된다.
typealias MyDict = [String: Int]
var userList: MyDict = ["user1": 1, "user2": 2,"user3": 3]
// user1 값 수정
userList["user1"] = 77
// user2 값 삭제
userList.removeValue(forKey: "user2")
print(userList) // 결과 : ["user3": 3, "user1": 77]
print(userList["user2"]) // 결과 : nil
반복, 조건, 정렬을 사용하여 응용해보기
딕셔너리를 for in
으로 반복시키고, 조건문을 작성하여 알맞게 값이 출력될 수 있게끔 만들어 보았다.
딕셔너리에 user를 key, 해당 user의 시험 점수를 value로 하여 시험 성적표를 담았다.
그리고 이 딕셔너리에서 시험 점수가 80점이 넘는 user만 출력시켰다.
typealias MyDict = [String: Int]
var examScore: MyDict = [
"user1": 53,
"user2": 81,
"user3": 84,
"user4": 96,
"user5": 95,
"user6": 49,
"user7": 77,
"user8": 32,
"user9": 76,
"user10": 72
]
for result in examScore {
if(result.value > 80) {
print("\(result.key)의 점수는 \(result.value)")
}
}
결과에서 볼 수 있듯이 딕셔너리는 요소들이 순서 없이 구성되기 때문에 코드와 무관하게, 값의 크고 작은 순 없이 순서가 무작위로 출력되는 것을 볼 수 있다.
그렇다면 이를 정렬하려면 어떤 방법이 필요할까?
sorted
를 활용하면 원하는 대로 나열할 수 있다.
typealias MyDict = [String: Int]
var examScore: MyDict = [
"user1": 53,
"user2": 81,
"user3": 84,
"user4": 96,
"user5": 95,
"user6": 49,
"user7": 77,
"user8": 32,
"user9": 76,
"user10": 72
]
let sortedDict = examScore.sorted { (first, second) in
return first.value > second.value
}
for result in sortedDict {
print("\(result.key)의 점수는 \(result.value)")
}
사본 sortedDict
를 만들고 sorted
를 value가 높은 순서대로 정렬하게끔 사용하였다.
원본 딕셔너리의 무작위 순서가 아닌 정렬된 결과를 얻었고, 그 결과를 반복문과 print()
를 사용하여 최종적으로 나타냈다.