Control-Flow, Collection, String, Function

최완식·2022년 2월 5일
0

Swift

목록 보기
3/36
post-thumbnail

프로그래밍 언어에서 자주 사용하는 것들인 제어문, 문자열, 함수에 대해서 적어보려한다. 다른 언어와 많은 점이 다르지는 않기 때문에 한 포스팅에서 모두 알아보려 한다. 다만 Switch, String(unicode, index 문제 때문)의 경우는 조금 다르니 추가로 알아보는 것을 추천드린다. 함수는 사실 closure의 일종인데, 이는 이 다음 글에서 알아보도록 하고, 이번에는 일반적으로 아는 함수의 개념으로 이해하고 글을 읽어보자.

Control Statements

반복

  • for-in
    • Sequence를 iterate
    • Sequence Protocol을 만족하는 모든 객체에서 사용가능
      • Sequence 정의
        • for-in loop로 순회할 수 있는 타입
      • Sequence 종류
  • while
    • 조건 문이 앞에 있기 때문에 최소 0회 실행
  • repeat-while
    • do-while과 유사
    • 조건문 뒤에 있기 때문에 최소 1회 실행

분기

  • if
    • if, else if, else
  • switch
    • Pattern Matching
    • 복잡한 조건에 따른 분기 가능
    • break문 사용하지 않아도 각 case만 실행하고 종료됨
      • 만약 아래까지 동작하고 싶다면 fallthrough 키워드 활용
    • 모든 case문은 반드시 실행문이 한줄이상 있어야 함
    • 모든 경우에 대해 case문이 없다면 반드시 default 필요
    • Interval Matching
      switch count {
      case 0:
          result = "no"
      case 1..<5:
          result = "few"
      default:
          result = "many"
      }
    • Value Binding
      switch point {
      case (let x, 0):
          print("x축 위에 있음")
      case (0, let y):
          print("y축 위에 있음")
      case (let x, let y) where x == y:
          print("y = x 위에 있음")
      case (let x, let y) where x == -y:
          print("y = -x 위에 있음")
      case (let x, let y):
          print("좌표평면 위에 있음")
      }
      • where 절을 사용하면 추가 조건 확인이 가능함

Collection

  • Value Type
    • 다른 변수에 대입하면 복사됨
    • argument로 넘겨도 복사됨
    • argument로 collection을 넘겨서 변화주면 원하는 결과를 얻을 수 없음
      • Objective-C의 경우 가능

Array

  • 동일한 Type의 값을 저장할 수 있는 Ordered List

  • 동일한 값이 다른 위치에서 반복적으로 낭로 수 있음

  • Foundation의 NSArray와 bridge

  • 표현

    let array: Array<SomeType>()
    let array: [SomeType]
    
    let array = [Int]()
    let array = Array<Int>()
  • 접근

    array[0] = "A"
    array[1..3] = ["a", "b", "c"]

Set

  • 동일한 type의 값을 저장할 수 있는 Collection
  • 동일 값 존재 불가
  • Foundation의 NSSet과 bridge
  • 표현
    let someSet: Set<Int>()
    let genres: Set<String> = ["Rock", "Classic", "Hip hop"]
    • type 명시가 없다면 array로 유추됨
  • Element
    • Element는 Hashable type이어야 함
    • 기본적인 type(String, int, Double, Bool)은 Hashable
    • Custom type을 Set에서 사용하려면 Hashable protocol 만족해야함
    • Hashable
      • public func hash(into hasher: inout Hasher)
      • 어떤 value에 hashValue를 제공해서 value의 동일성을 검충하는데 사용
      • value(struct)의 모든 값을 비교하는 것보다 빠름

Dictionary

  • key, value의 쌍을 저장하는 collection

  • key, value는 각각 type이 지정되어야 함

  • key는 dictionary안에서 unique하며, value의 identifier로 동작

  • key는 hashable

  • 순서 없이 저장한다.

  • 표현

    let a: Dictionary<KeyType, ValueType>
    let b: [KeyType: ValueType]
    
    a = Dictionary<Int: String>()
    b = [Int: String]()
    var airports: [String, String] = ["XYZ": "Toronto", "DUB": "Dublin"]
    var airports = ["XYZ": "Toronto", "DUB": "Dublin"]
  • 메서드

    • updateValue
    • removeValue

String

  • Extended String Delimiters
    • #
    • #""Hello World""# = Hello world
    • 특수문자들을 그대로 표현 가능
    • String literal 선언을 #로 감쌈
    • escape seqence\n은 아래와 같이 사용
    • #"Line1\#nLine2#
      • Line1
      • Line2
  • Concatenating
    • + 가능
  • String Interpolation
    • "\(name) 는 \(food)을 먹습니다"
  • Unicode
    • String은 내부적으로 Unicode scalar value를 사용함
    • 21-bit number
      let precomposed: Character = "\u{D55C}" // 한
      let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ㅎ,ㅏ,ㄴ = 한으로 표현됨
  • Index
    • String.Index로 다룰 수 있음
    • 해당 함수들로 다뤄야 함. 상당히 귀찮음

Function

  • 일급 함수

    • parameter로 사용가능
    • return 값으로 사용가능
    • 익명함수
  • argument label

    • 호출하는 쪽에서 사용하는 이름
  • parameter name

    • function 안에서 사용하는 이름
  • Variadic parameters

    • 0개 이상의 특별한 타입을 나열해서 파라미터로 넘길 수 있음

    • ...을 넣어서 사용

    • 이렇게 선언된 경우 함수안에서 해당 type의 Array로 사용할 수 있음

      func sum(values: Int...) -> Int {
          var result = 0
          
          for value in values {
              result += value
          }
      
          return result
      }
      
      sum(10, 20, 30) // 60
  • inout parameters

    • 일반적으로 함수에 전달된 파라미터의 변경은 함수안에서만 유효
    • 하지만 function에서 바깥쪽 값을 바꿔야할 경우가 있음 (swap)
    • inout으로 선언된 경우, 해당 변화가 호출된 쪽에 반영됨
profile
Goal, Plan, Execute.

0개의 댓글