🌟핵심 정리🌟

✅ 클로저

  • 클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호“{}”로 구분된 코드의 블럭이며, 일급 객체의 역할
  • 일급 객체 : 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있음
  • 함수는 클로저의 한 형태로, 이름이 있는 클로저
{ (인자들) -> 반환타입 in
  로직 구현
}
let reverseNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2})
let reversedNames = names.sorted(by: > )

🌟 map

  • 콜렉션 내부의 기존 데이터를 변형하여 새로운 콜렉션 생성
let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.map { $0 + 1 } // [3, 9, 16]

🌟 filter

  • 콜렉션 내부의 데이터를 조건에 맞는 새로운 콜렉션으로 생성
let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.filter { $0 % 2 == 0} // [2, 8]

🌟 reduce

  • 컨테이너 내부의 콘텐츠를 하나로 통합(ex. Element들의 총합, 총곱 등)
let numbers: [Int] = [2,8,15]
// 초기값이 3에 정수 배열의 모든 값을 더한다.
var sum: Int = numbers.reduce(3) { $0 + $1 } // 28

✅ 열거형

🌟 관련 값

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

✅ 클래스와 구조체

🌟 공통점

  • 값을 저장하기 위한 프로퍼티 정의
  • 기능을 제공하기 위한 메소드 정의
  • subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
  • 초기 상태를 설정할 수 있는 initializer 정의
  • 기본 구현에서 기능 확장
  • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)

🌟 클래스만 가능한 기능

  • 상속 (Inheritance) : 클래스의 여러 속성을 다른 클래스에 물려 줌
  • 타입 캐스팅 (Type casting) : 런타임에 클래스 인스턴스의 타입을 확인
  • 소멸자 (Deinitializers) : 할당된 자원을 해제(free up) 시킴
  • 참조 카운트 (Reference counting) : 클래스 인스턴스에 하나 이상의 참조가 가능

🚨 구조체는 다른 코드로 전달될 때 항상 복사되서 전달되고, 참조 카운트(Reference counting)를 사용하지 않음

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()  // 위 Resolution 구조체를 값으로 사용
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

클래스와 구조체의 선택

🌟 일반적으로 다음의 조건 중 1개 이상을 만족하면 구조체를 사용하는 것을 고려해 볼 수 있음

  • 구조체의 주 목적이 관계된 간단한 값을 캡슐화(encapsulate) 하기 위한 것인 경우
  • 구조체의 인스턴스가 참조되기 보다 복사되기를 기대하는 경우
  • 구조체에 의해 저장된 어떠한 프로퍼티가 참조되기 보다 복사되기를 기대하는 경우
  • 구조체가 프로퍼티나 메소드 등을 상속할 필요가 없는 경우

✅ 프로퍼티

🌟 프로퍼티는 클래스, 구조체, 열거형과 관련한 값
🌟 프로퍼티의 종류 : 저장 프로퍼티(Stored Properties), 계산된 프로퍼티(Computed Properties)
🌟 저장 프로퍼티 : 말 그대로 값을 저장하고 있는 프로퍼티
🌟 계산된 프로퍼티 : 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
🌟 계산된 프로퍼티는 클래스, 구조체, 열거형 모두에서 사용가능하지만, 저장 프로퍼티는 클래스와 구조체에서만 사용 가능. 추가로 프로퍼티 옵저버를 정의해서 값이 변할 때마다 모니터링할 수 있음

✅ 메소드

🌟 메소드 : 특정 타입의 클래스, 구조체, 열거형과 관련된 함수
🌟 특정 타입의 인스턴스에서 실행할 수 있는 메소드를 인스턴스 메소드, 특정 형과 관련된 메소드를 타입 메소드
🌟 타입 메소드 : Objective-C에서 클래스 메소드와 유사.
🌟 Swift에서 메소드가 C나 Objective-C 메소드 간의 가장 큰 차이는 바로 Objective-C에서는 클래스 타입에서만 메소드를 선언할 수 있다는 것.
🌟 반면 Swift에서는 클래스 타입 뿐만아니라 구조체, 열거형에서도 메소드를 선언해 사용할 수 있음.

✅ 서브스크립트

🌟 서브스크립트 : 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용. 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법.
🌟 서브스크립트를 이용하면 추가적인 메소드 없이 특정 값을 할당(assign)하거나 가져올 수(retrieve) 있음.
🌟 예를들면, 배열(Array) 인스턴스의 특정 엘리먼트는 someArray[index]문법으로, 사전(Dictionary) 인스턴스의 특정 엘리먼트는 someDictionary[key]로 접근.
🌟 하나의 타입에 여러 서브스크립트를 정의할 수 있고 오버로드(Overload)도 가능.
🌟 뿐만아니라 단일 인자 값을 넘어, 필요 따라 복수 인자 값을 사용할 수 있음.

profile
iOS 개발자😺

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN