💡 컬렉션 타입

  • 컬렉션 타입 : 여러 값들을 묶어서 하나의 변수로 표현

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)

📎 결과
[1]
[1, 100]

contains

  • Array안에 해당 숫자가 있는지 판별

있으면 true 반환
없으면 false 반환

integers.contains(100)
integers.contains(99)

📎 결과
true
false

remove


  1. remove(at: 인덱스)
  • Array안에 해당 위치 값 삭제 후 값 반환
integers.remove(at: 0)

📎 결과
1


  1. removeLast()
  • 마지막 값 삭제 후 값 반환
integers.removeLast()

📎 결과
100


  1. 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

📎 결과
["someKey":"value", "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)

📎 결과
true
false

remove


  1. remove(원소 값)
  • Set 안에 해당 원소 값 삭제 후 값 반환
integerSet.remove(100)

📎 결과
100


  1. removeFirst()
  • 마지막 값 삭제 후 값 반환
integerSet.removeFirst()

📎 결과
99


count

  • 몇개의 원소가 있는지 확인
integerSet.count


Set 응용

let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]

  1. union (합집합)
  • 결과 정렬 X
let union: Set<Int> = setA.union(setB)

📎 결과
{2, 4, 5, 6, 7, 3, 1}


let sortedUnion: [Int] = union.sorted()

📎 결과
{1, 2, 3, 4, 5, 6, 7}


`
  1. intersection (교집합)
  • 결과 정렬 X
let intersection: Set<Int> = setA.intersection(setB)

📎 결과
{5, 3, 4}


  1. subtracting (차집합)
  • 결과 정렬 X
let subtracting: Set<Int> = setA.subtracting(setB)

📎 결과
{2, 1}



💡 함수

함수의 선언

  • 함수 선언의 기본형태

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