Swift 기초 다지기 (2)
💡 컬렉션 타입
- 컬렉션 타입 : 여러 값들을 묶어서 하나의 변수로 표현
1. Array
- Array : 순서가 있는 list 컬렉션
빈 Array 생성
🎯 Int Array 생성
var integers: Array<Int> = Array<Int>()
🎯 Double Array 생성
var doubles: Array<Double> = [Double]()
🎯 String Array 생성
var strings: [String] = [String]()
🎯 Character Array 생성
var characters: [Character] = []
⭐️ let을 사용해 Array 선언 시 Array 원소 변경 불가능
let immutableArray = [1,2,3]
- immutableArray.append(4) 또는 immuntableArray.removeAll() 과 같은 명령어 사용 불가능
append
- Int 타입으로 Array를 생성했기 때문에 Int 타입의 숫자들만 추가할 수 있다.
integers.append(1)
integers.append(100)
contains
- Array안에 해당 숫자가 있는지 판별
있으면 true 반환 없으면 false 반환
integers.contains(100)
integers.contains(99)
remove
- remove(at: 인덱스)
- Array안에 해당 위치 값 삭제 후 값 반환
integers.remove(at: 0)
- removeLast()
- 마지막 값 삭제 후 값 반환
integers.removeLast()
- removeAll()
- 모두 삭제
integers.removeAll()
count
- 몇개의 원소가 있는지 확인
integers.count
2. Dictionary
- Dictionary : 키와 값의 쌍으로 이루어진 컬렉션
빈 Dictionary 생성
🎯 Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성
var antDictionary: Dictionary<String, Any> = [String: Any]()
// 각각의 Key에 Value 할당하기
anyDictionay["someKey"] = "value"
anyDictionary["anotherKey"] = 100
// 기존 Key에 새로운 값(Value)할당해주기
anyDictionay["someKey"] = "dictionary"
🎯 let으로 불변 Dictionary 선언
let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "zorba", "gender": "female"]
value 삭제
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
3. Set
- Set : 순서가 없고, 멤버가 유일한 컬렉션
빈 Set 생성
var integerSet: Set<Int> = Set<Int>()
insert
- 원소 추가
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
// Set에서는 중복을 허락하지 않기 때문에 99가 두번 추가되어도 결과에 한번밖에 나타나지 않는다.
contains
- 원소 포함여부 확인
integerSet.contains(1)
integerSet.contains(2)
remove
- remove(원소 값)
- Set 안에 해당 원소 값 삭제 후 값 반환
integerSet.remove(100)
- removeFirst()
- 마지막 값 삭제 후 값 반환
integerSet.removeFirst()
count
- 몇개의 원소가 있는지 확인
integerSet.count
Set 응용
let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]
- union (합집합)
- 결과 정렬 X
let union: Set<Int> = setA.union(setB)
let sortedUnion: [Int] = union.sorted()
- intersection (교집합)
- 결과 정렬 X
let intersection: Set<Int> = setA.intersection(setB)
- subtracting (차집합)
- 결과 정렬 X
let subtracting: Set<Int> = setA.subtracting(setB)
💡 함수
함수의 선언
- 함수 선언의 기본형태
func 함수이름 (매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 …) -> 반환타입 { 함수 구현부 return 반환값 }
func sum(a: Int, b: Int) -> Int {
return a + b
}
- 반환 값이 없는 함수
func 함수이름 (매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 …) -> Void { 함수 구현부 return }
func printMyName(name: String) -> Void {
print(name)
}
// 생략도 가능
func printMyName(name: String) {
print(name)
}
- 매개변수가 없는 함수
func 함수이름 () -> 반환타입 { 함수 구현부 return 반환값 }
func maximumIntegerValue() -> Int {
return Int.max
}
- 매개변수와 반환값이 없는 함수
func 함수이름() -> Void { 함수 구현부 return }
func hello() -> Void {
print("hello")
}
// 생략도 가능
func bye() {print("bye")}
함수의 호출
func sum(a: Int, b: Int) -> Int {
return a + b
}
sum(a: 3, b: 5)
📎 결과
8
func printMyName(name: String) {
print(name)
}
printMyName(name: "gyuri")
📎 결과
gyuri
func hello() -> Void {
print("hello")
}
hello()
📎 결과
hello
매개변수 기본값
func 함수이름 (매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 …) -> 반환타입 { 함수 구현부 return 반환값 }
- 함수의 매개변수에 값이 들어가지 않아도 자동적으로 매개변수가 갖게 되는 값
- 기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하는 것이 좋음
func greeting(friend: String, me: String = "gyuri") {
print("Hello \(friend)! I am \(me)")
}
// friend : 기본값이 없는 매개변수
// me : 기본값이 gyuri인 매개변수
- 매개변수 기본값을 가지는 매개변수는 생략 가능
greeting(friend: "Jenny")
// Hello Jenny! I am gyuri
greeting(friend: "GD", me: "Doris")
// Hello GD! I am Doris
전달인자 레이블
- 함수를 호출할 때 매개변수의 역할을 더 명확하게 하거나 함수 사용자의 입장에서 표현하고자 할 때 사용
- 함수의 중복 정의도 쉽게 가능
func 함수이름 (전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 …) -> 반환타입 { 함수 구현부 return }
- 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I am \(me)")
}
// 전달인자 레이블 : to, from
// 매개변수 이름 : friend, me
- 함수를 호출할 때에는 전달인자 레이블을 사용
greeting(to: "GD", from: "gyuri")
// Hello GD! I am gyuri
가변 매개변수
- 전달 받을 값의 개수를 알기 어려울 때 사용
- 가변 매개변수는 함수당 하나만 가질 수 있다.
func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입…) -> 반환타입 { 함수 구현부 return }
func sayHelloToFriends(me: String, friends: String...) -> String {
return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "gyuri", friends: "jenny", "rose", "jisoo", "risa"))
- 🚫 전달인자가 없거나 nil 입력 시 오류 발생
데이터 타입으로서의 함수
- Swift는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어
- Swift의 함수는 일급객체이므로 변수, 상수 등에 저장이 가능하고 매개변수를 통해 전달할 수도 있다.
함수의 타입표현
- Swift의 함수는 하나의 데이터 타입으로서 표현될 수 있다.
- 반환타입을 생략할 수 없다.
(매개변수1타입, 매개변수2타입 …) -> 반환타입
var someFunction: (String, String) -> Void = greeting(to:from:)
// 변수 someFunction에 (String 타입의 매개변수 2개를 가지고 반환값이 없는) 함수 할당
someFunction("GD", "gyuri")
📎 결과
Hello GD! I am gyuri
someFunction = greeting(friend:me:)
someFunction("GD", "gyuri")
📎 결과
Hello GD! I am gyuri
- 타입이 다른 함수는 할당할 수 없다.
someFunction = sayHelloToFriends(me:friends:)
// 🚫 friends가 가변 매개변수를 가지므로 오류 코드 🚫
- 함수 타입을 매개변수 타입으로 지정해주면 함수 내부에서도 실행 가능
func runAnother(function: (String, String) -> Void) {
function("jenny", "mike")
}
// 1. 함수 직접 넘겨주기
runAnother(function: greeting(friend:me:))
// 2. 함수가 할당된 변수 넘겨주기
runAnother(function: someFunction)
📎 결과
Hello jenny! I am mike