Swift 2일차

Collection

Array

  1. 같은 타입의 Element만 담아야 한다.
  2. 순서가 존재한다.
var oddNumbers: [Int] = [1, 3, 5]
var oddNumbers2: Array<Int> = [1, 3, 5]

oddNumbers.append(7) // [1, 3, 5, 7]
oddNumbers.append(contentOf: [9, 11]) // [1, 3, 5, 7, 9, 11]
oddNumbers += [13, 15] // [1, 3, 5, 7, 9, 11, 13, 15]

oddNumbers.isEmpty // false
oddNumbers.count // 8

print(oddNumbers.first) // Optional(1)
print(oddNumbers.first!) // 1
oddNumbers = []
print(oddNumbers.first) // nil

if let firstElement = oddNumbers.first {
    // oddNumbers.first가 nil이 아니면
    ...
}

oddNumbers.max() // 15
oddNumbers.min() // 1

oddNumbers[0...3] // [1, 3, 5, 7]


oddNumbers.contains(2) // false
oddNumbers.insert(21, at: 0) // [21, 1, 3...]
oddNumbers.remove(at: 0) // [1, 3...]

oddNumbers[0] = 21 // [21, 1, 3...]
oddNumbers[0...2] = [1, 2, 1] // [1, 2, 1, 7...]

oddNumbers.swapAt(1, 2) [1, 5, 3...]


for (index, value) in oddNumbers.enumerated() {
    print(index, "&", value)
}


oddNumbers.dropFirst(3) // [7, 9, 11, 13, 15]
oddNumbers.dropLast(3) // [1, 3, 5, 7, 9]

oddNumbers.prefix(3) // [1, 3, 5]
oddNumbers.sufix(3) // [11, 13, 15]

Dictionary

  1. key(Unique)와 value로 구성된다.
  2. 순서가 없다.
var scoreDic: [String: Int] = ["A": 80, "B": 95, "C": 90]
var scoreDic2 : Dictionary<String, Int> = ["A": 80, "B": 95, "C": 90]

scoreDic["D"] // nil

if let score = scoreDic["E"] {
    ...
} else {
    ...
}

scoreDic.isEmpty
scoreDic.count

scoreDic["D"] = 75 // 추가
scoreDic["B"] = 100 // 수정
scoreDic["D"] = nil // 삭제


for (name, score) in scoreDic {
    ...
}

for key in scoreDic.keys
for value in scoreDic.values


var me: [String: String] = ["name": "다솔", "city": "경기도"]

func printMe(_ inputDic: [String: String]) {
    if let name = inputDic["name"], let city = inputDic["city"] {
        ...
    } else {
        ...
    }
}

printMe(me)

Set

  1. 유일한 값을 가진다.
  2. 순서가 없다.
var testSet: Set<Int> = [1, 2, 3, 1, 2] // {1, 2, 3}

Closure

  • 이름이 없는 Method
var multiplyClosure: (Int, Int) -> Int = { a, b in 
    return a * b
}

var multiplyClosure: (Int, Int) -> Int = { $0 * $1 }



funct operateTwoNum(a: Int, b: Int, c: (Int, Int) -> Int) -> Int {
    return c(a, b)
}

operateTwoNum(a: 3, b: 7, c: multiplyClosure) // 21

operateTwoNum(a: 3, b: 7, c: { a, b in 
    return a + b }) // 10


let voidClosure: () -> Void = {
    pirnt("IOS Developer")
}

voidClosure() // IOS Developer
  • 즉, 함수와 공통점과 차이점이 존재한다.
  • 이름과, fuc 키워드 유무가 다르다.
  • 인자를 받고, 값을 리턴하고, 변수로 할당할 수 있고, First Class Type, Reference Type인 것은 같다.
  • 함수는 Closure의 한가지 타입
  • Global 함수
  • Nested 함수
  • Closure Expressions
// 1. Simple closure
let simpleClosure = {
}
simpleClosure()

// 2. code block
let exampleClosure1 = {
    print("Hello Swift")    
}

// 3. input parameter
let exampleClosure2: (String) -> Void = { name in 
    print("Hello \(name)")
}

// 4. return
let exampleClosure3: (String) -> String = { name in 
    let message = "Hello \(name)"
    return message
}

// 5. parameter
func exampleClosure4(message: String, closure: () -> Void) {
    print("함수에서 호출됨 : \(message)")
    closure()
}

exampleClosure4(message: "메세지 내용", closure: { print("클로저에서 호출됨") })

// 6. Trailing closure
// 인자가 여러 개 있고 closure가 인자 중에 맨 마지막이면
exampleClosure4(message: "메세지 내용") { print("클로저에서 호출됨") }

First Class Type

  • 변수에 할당할 수 있다.
  • 인자로 받을 수 있다.
  • 리턴할 수 있다.
  • 예를 들어, Int 처럼.

Completion Block

어떤 태스크가 완료되면 클로저가 수행
네트워크를 통해 데이터를 받아오는 작업
언제 끝날지 모르는 비동기 처리
끝났을 때 돌아가는 블럭

Higher Order Functions

  • 인자로 input을 함수로 받을 수 있는 유형의 함수
  • 고개함수 : filter, reduce ...

Capturing Values

if true {
    let numOutside = 3
    
    if true {
        let numInside = 5
        print(numOutside, numInside)
    }
    
    print(numOutside, numInside) // ERROR
}

안쪽, 바깥쪽 scope

var count = 0

let incrementer = {
    count += 1
}

for _ in 0...6 {
    incrementer()
}

count // 7
{ (paramters) -> returnType in
    statements
}
  • in을 기준으로 한다.

Structure

관계가 있는 것들을 묶어서 표현.

Object = Data + Method

Object는 Structure와 Class로 나타낼 수 있다.

StructureClass
Value TypesReference Types
CopyShare
StackHeap
let pClass1 = PersonClass(name: "A", age: 5)
let pClass2 = pClass1
pClass2.name = "B" // 공유

pClass1.name // B
pClass2.name // B

let pStruct1 = PersonClass(name: "A", age: 5)
let pStruct2 = pStruct1
pStruct2.name = "B" // 복사

pStruct1.name // A
pStruct2.name // B
  • 클래스 변수는 같은 인스턴스를 가리키고 있다.
  • 구조체 변수는 기존의 인스턴스를 복사해서 새로운 인스턴스를 만든다.

가장 까까운 편의점 찾기

좋은 웹페이지 즐겨찾기