[Swift] Collection

임승섭·2023년 5월 14일
0

Swift

목록 보기
3/35

컬렉션(collection) : 여러개의 데이터를 한꺼번에 담루는 바구니 타입

  • Array, Dictionary, Set

Array

Part 1

var numsArray = [1, 2, 3, 4, 5]
var stringArray : [String] = ["apple", "swift", "ios", "hello"]

// 정식문법
let strArray1 : Array<String> = []
// 단축문법
let strArray2 : [String] = []



// 빈 배열 생성하기
let emptyArray1 : [Int] = []		// 변수 선언 해줘야 함
let emptyArray2 = Array<int>()		// 생성자 사용
let emptyArray3 = [Int]()			// 생성자 사용



// 배열 기능
var numsArray = [1, 2, 3, 4, 5]

numsArray.count		// 5
numsArray.isEmpty	// false
numsArray.contains(1)		// true
numsArray.contains(8)		// false
numsArray.randomElement()	// 배열에서 랜덤으로 하나 추출
numsArray.swapAt(0, 1)		// 0과 1 순서 바꿔



// 배열 element에 접근
var numsArray = [1, 2, 3, 4, 5]
var stringArray : [String] = ["apple", "swift", "ios", "hello"]

stringArray[0]		// "apple"
stringArray[3]		// "hello"

stringArray[1] = "steve"		// ["apple", steve", "ios", "hello"]

stringArray.first	// Optional("apple") -> 값이 없을 수도 있는 경우가 있기 때문에 옵셔널로 준다
stringArray.last	// "hello"

stringArray.startIndex	// 0
stringArray.endIndx		// 4   ->  강의자료 보면 이해하기 쉽다. 마지막 element + 1

stringArray.index(0, offsetBy : 2) // 0이라는 인덱스부터 2 떨어져 있는거 => 2 출력
stringArray.index(1, offsetBy : 2) // 3


stringArray.firstIndex(of : "ios")	// 앞에서부터 찾았을 때 몇 번째에 있냐 => 2 출력
stringArray.lastIndex(of : "ios") 	// 뒤에서부터 찾았을 때 (앞에서부터) 몇 번째에 있냐 => 2 출력
// 지금은 두 함수가 같은 값이 나오지만, 중복된 값이 배열에 존재할 때 다른 값이 나오게 된다



// 위에서 stringArray.first는 Optional로 주었기 때문에 코드 짤 때 주의하자
if let index = stringArray.firstIndex(of:"ios")  {
	print(index)
    print(stringArray[index])
}

Part 2

// 삽입 (insert)
var arr = ["a", "b", "c", "d", "e", "f", "g"]

arr.insert("h", at : 7)		// ["a", "b", "c", "d", "e", "f", "g", "h"]
arr.insert(contentsOf : ["h", "i"], at : 7		// contentsOf는 배열을 주는거



// 교체 (replace)
arr[0] = "a"
arr[0...2] = ["x", "y", "z"]	// 범위를 교체
arr[0...1] = []			// 원하는 범위 삭제

arr.replaceSubrange(0...2, with : ["p", "q", "r"]	// replace 함수 사용



// 추가 (append)
arr += ["h"]
arr.append("h")
arr.append(contentsOf : ["h", "i"])

arr.append(4) // 에러



// 삭제 (remove)
arr[0...2] = []
arr.remove(at : 2)		// 두 번째 자리에 있는 element 삭제
arr.remove(at : 8) // 에러 (Index out of range)

arr.remove(at : arr.endIndex - 1) // 마지막에 있는 원소 지우는 방법
arr.removeSubrange(0...2)

arr.removeFirst()	// 첫 번째 요소 지워
arr.removeFirst(2)  // 앞에 두 개 지워
// 주의 : removeFirst()는 리턴으로 Optional이 아니라 그냥 String 타입을 주기 때문에 빈 배열에 대해 실행하면 에러가 발생한다

arr.removeLast(2)	// 뒤에 두 개 지워

arr.removeAll()
arr.removeAll(keepingCapacity : true)	// 저장 공간을 일단 보관해 두고, 안에 데이터만 지워준다

Part 3

var nums = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]

nums.sort()		// 배열 자체를 정렬. return 없음.
nums.sorted()	// 변경된 배열을 반환. 원본 배열은 건드리지 않는다
// 애플이 함수 이름을 만드는 규칙

nums.reverse()
nums.reversed()

nums.sorted().reversed()	// 이런 방식으로 가능

nums.shuffle()
nums.shuffled()


// 활용
// p를 지워
if let lastIndexOfP = puppy1.lastIndex(of : "p") {
	puppy1.remove(at : lastIndexOfP)
}


// 열거 named tuple 형태로 전달한다
var nums = [10, 11, 12, 13, 14]
for tuple in nums.enumerated() {
	print(tuple)
}

Dictionary

  • 데이터를 키와 값으로 하나의 쌍으로 만들어 관리
  • key는 중복x, value는 중복 가능
  • 타입은 계속 동일해야 함
  • key는 hashable해야 한다.
    • hasable : hash함수에서 input으로 쓰일 수 있는 타입
      즉, hash함수를 사용해서 유일한 값으로 변환이 가능하다
    • swift의 기본 타입은 모두 hashable하다
    • 검색 속도가 빠르다

Part1

var dic = ["a": "apple", "b": "banana", "c": "city"]
print(dic) // 순서가 없기 때문에 출력할 때마다 순서가 다르게 나온다


// 단축문법
var words : [String: String] = [:]

// 정식문법
let words1 : Dictionary<Int, String>

// 빈 dictionary 생성
let emptyDic1: Dictionary<Int, String> = [:]
let emptyDic2 = Dictionary<Int, String>()
let emptyDic3 = [Int: String]()

// dictionary 기능
dic.count
dic.isEmpty

dic.randomElement()		// Optional 타입으로 알려준다. 없으면 nill
// 실제 사용할 때는 if let 바인딩 이용하자

// 원소 접근
dic["a"]		// Optional 타입으로 알려줌.
// 무조건 쌍으로. value만 따로 검색하는 방법은 없다


dic.keys
dic.values

dic.keys.sorted()
dic.values.sorted()


// update (insert + replace + append)
words = [:]
words["a"] = "apple"	// 추가
words["b"] = "banana"
words["b"] = "blue"		// 교체

words.updateValue("city", forKey : "c")


// remove
dic["b"] = nill		// 삭제
dic["e"] = nill		// 없는거 삭제하려고 해도 아무 일 안일어남
dic.removeValue(forKey : "a")
dic.removeAll()

Part 2

// 비교
dictionary는 순서가 없기 때문에, 다른 순서로 선언해도 속에 내용만 같으면 true 출력
dic1 == dic2


// value에 array나 dictionary가 들어갈 수 있다
var dic1 = [String : [String]()
var dic2 = [String : [String: Int]()


// 반복문과의 결합
let dict = ["a": "apple", "b": "banana", "c": "city"]

for (key, value) in dict {			// tuple 형태로 꺼낼 수 있다
	print("\(key) : \(value)")
}
for item in dict {
	print("\(item.key) : \(item.value)") 
}

for (key, _) in dict {
	print("Key : ", key)
}

for (_, value) in dict {
	print("Value : ", value)
}

Set

  • array와 동일하게 대괄호로 묶기 때문에 생성 시 타입 선언을 해주어야 한다
  • 순서 없음. 중복도 없음
var set: Set = [1, 1, 2, 2, 3, 3, 3]
var set: Set<Int> = [1, 1, 2, 2, 3, 3, 3] 	// 중복 저장이 안됨 [1, 2, 3]. 순서도 계속 바뀜


// update (리턴값이 있다)
set.update(with : 1)		// 이미 있으면 1 반환
set.update(with : 2)		// 없는 애면 nill 반환


// remove (얘도 리턴값이 있다)
set.remove(1)
set.remove(100)

0개의 댓글