본문 바로가기

iOS-Study

iOS Study : 6주차 - Simple Value / Control Flow / Functions and Closures / Object and Classes

Simple Value

  • let은 상수값을 만드는데 사용되고 , var은 변수값을 만드는데 사용된다.
  • 상수나 변수를 만들 때 값을 선언하면 컴파일러에서 해당 자료형을 추론하기 때문에 자료형은 생략해도 된다.
  • 문자열에 값을 표현하기 위해서는 \()에서 괄호 안에 변수명을 넣어주면 된다.

 

Control Flow

  • if문이나 switch문을 사용하여 조건을 명시하고 for-in, while, repeat-while 구문을 사용하여 반복 실행한다.
  • if문을 사용할 때는 실행 코드가 한줄이더라도 { } 를 사용해야 한다.
  • 명령문에서 if 조건의 반환값은 Bool 타입이어야 한다.
  • switch문에서는 case 끝에 break를 작성할 필요가 없다.
  • for 문에서 범위를 표현할 때 ...을 사용한다. ex) 0 ... 4 는 0부터 4까지 / 0 ..<4는 0부터 3까지

 

Functions and Closure

  • func를 사용하여 함수를 선언하며 괄호 안에 매개변수 명과 자료형을 넣고 -> 뒤에 반환값의 자료형을 쓴다.
func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

 

  • 기본적으로 함수는 매개변수 이름으로 호출을 하는데 외부 매개변수와 내부 매개변수 둘 다 사용하는 경우 외부 매개변수를 호출하는데 사용을 하게 되고 선언 시 외부 매개변수 자리에 _를 사용하면 호출 할 때 생략이 가능하다.
  • 외부 매개변수를 사용하지 않는 경우 내부 매개변수가 호출하는데 사용된다.
작성하거나 _인수 레이블을 사용하지 않도록 작성하십시오.

func greet(_ person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")

 

  • 함수는 중첩해서 사용이 가능하다.
func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

 

  • 함수는 일급 객체로 함수를 변수에 저장할 수 있고, 매개변수로도 전달 가능하며 리턴값으로 사용 가능하다.
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)

 

  • 클로저 표현식은 독립적인 코드 블록이다.
  • 일급 시민으로 전달인자, 변수, 상수 등으로 저장, 전달이 가능하다.
  • 함수는 클로저의 일종으로, 이름 있는 클로저라고 생각하면 된다.
  • 함수의 리턴값 자료형 뒤에 in을 붙여서 사용한다.
numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})

 

Objects and Classes

  • class 뒤에 이름을 선언하여 클래스를 생성한다.
class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}
  • 클래스에서 프로퍼티의 기본값을 지정하기 어려운 경우 init을 사용하여 초기값을 전달한다.
  • 변수명이 겹치는 경우 self를 사용하여 구분한다.
class NamedShape {
    var numberOfSides: Int = 0
    var name: String

    init(name: String) {
        self.name = name
    }

    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

 

  • 프로퍼티를 구현할 때 읽기와 쓰기 모두 가능한 get 블럭과 set 블럭을 사용할 수 있는데, set 블럭에서는 암시적 매개변수인
    newValue를 사용할 수 있다.
class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
        get {
            return 3.0 * sideLength
        }
        set {
            sideLength = newValue / 3.0
        }
    }

    override func simpleDescription() -> String {
        return "An equilateral triangle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
// Prints "9.3"
triangle.perimeter = 9.9
print(triangle.sideLength)
// Prints "3.3000000000000003"