swift
swift - Set #1 (Create a Set, Inspecting a Set, Testing MemberShip, Adding and Removing Elements)
행복하게사는게꿈
2021. 1. 7. 04:45
Set
- 배열과 딕셔너리에 비해 많이 사용되지는 않는다.
- 주로 정렬 순서보다 검색 속도가 더 중요한 경우 배열 대신 사용
순서가 없다. 인덱스도 없음
동일한 값은 하나만 저장 -> 있는 값을 저장하면 그냥 무시됨
동일한 타입만 저장
배열보다 검색속도가 빠른 이유
해싱 알고리즘을 사용하기 때문에
Create a Set
// Set
// Set은 리터럴이 없고 배열 리터럴을 사용한다.
let set = [1, 2, 2, 2, 3, 3, 3]
set.count
let set2 = Set<Int>(set)
set2.count
Inspecting a Set
set2.count
set2.isEmpty
Testing for Membership
// 요소가 포함되어 있는지 확인하는 작업에 제일 많이 사용
set2.contains(1)
Adding and Removing Elements
var words = Set<String>()
// 추가하고 결과를 튜플로 return
var insertResult = words.insert("Swift")
insertResult.inserted // 추가되었으면 true 안됐으면 false
insertResult.memberAfterInsert // 추가된 값 or 기존에 있던 값
insertResult = words.insert("Swift")
insertResult.inserted // 추가되었으면 true 안됐으면 false
insertResult.memberAfterInsert // 추가된 값 or 기존에 있던 값
// 새로운 요소를 추가하면 nil, update하면 입력한 파라미터 return
var updateResult = words.update(with: "Apple")
updateResult
var value = "Swift"
value.hashValue
updateResult = words.update(with: value)
updateResult
value = "Hello"
value.hashValue
updateResult = words.update(with: value)
updateResult
// Set이 update될때 hash값으로 비교한다.
struct SampleData: Hashable {
var hashValue: Int = 123
var data: String
init(_ data: String) {
self.data = data
}
static func == (lhs: SampleData, rhs:SampleData) -> Bool {
return lhs.hashValue == rhs.hashValue
}
}
var sampleSet = Set<SampleData>()
var data = SampleData("Swift")
data.hashValue
var r = sampleSet.insert(data)
r.inserted
r.memberAfterInsert
sampleSet
data.data = "Hello"
data.hashValue
// 여기서 다시보면 hashValue가 123으로 고정이기 때문에 문자열이 다르더라도 최신
// 데이터로 바뀌지 않는다.
r = sampleSet.insert(data)
r.inserted
r.memberAfterInsert
sampleSet
// 이 때 사용하는 메소드가 update이다.
sampleSet.update(with: data)
sampleSet
// 요소를 삭제
// 하나의 element 삭제 : 삭제 후 삭제된 value 리턴
words.remove("Swift")
words
// 존재하지 않는 요소 삭제 : nil 리턴
words.remove("Ghost")
// 전체요소 삭제
words.removeAll()