클로저
는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호“{}”
로 구분된 코드의 블럭이며, 일급 객체
의 역할일급 객체
: 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있음{ (인자들) -> 반환타입 in
로직 구현
}
let reverseNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2})
let reversedNames = names.sorted(by: > )
let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.map { $0 + 1 } // [3, 9, 16]
let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.filter { $0 % 2 == 0} // [2, 8]
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."
🌟 공통점
🌟 클래스만 가능한 기능
🚨 구조체는 다른 코드로 전달될 때 항상 복사되서 전달되고, 참조 카운트(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개 이상을 만족하면 구조체를 사용하는 것을 고려해 볼 수 있음
🌟 프로퍼티는 클래스, 구조체, 열거형과 관련한 값
🌟 프로퍼티의 종류 : 저장 프로퍼티(Stored Properties), 계산된 프로퍼티(Computed Properties)
🌟 저장 프로퍼티 : 말 그대로 값을 저장하고 있는 프로퍼티
🌟 계산된 프로퍼티 : 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
🌟 계산된 프로퍼티는 클래스, 구조체, 열거형 모두에서 사용가능하지만, 저장 프로퍼티는 클래스와 구조체에서만 사용 가능. 추가로 프로퍼티 옵저버를 정의해서 값이 변할 때마다 모니터링할 수 있음
🌟 메소드 : 특정 타입의 클래스, 구조체, 열거형과 관련된 함수
🌟 특정 타입의 인스턴스에서 실행할 수 있는 메소드를 인스턴스 메소드, 특정 형과 관련된 메소드를 타입 메소드
🌟 타입 메소드 : Objective-C에서 클래스 메소드와 유사.
🌟 Swift에서 메소드가 C나 Objective-C 메소드 간의 가장 큰 차이는 바로 Objective-C에서는 클래스 타입에서만 메소드를 선언할 수 있다는 것.
🌟 반면 Swift에서는 클래스 타입 뿐만아니라 구조체, 열거형에서도 메소드를 선언해 사용할 수 있음.
🌟 서브스크립트 : 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용. 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법.
🌟 서브스크립트를 이용하면 추가적인 메소드 없이 특정 값을 할당(assign)하거나 가져올 수(retrieve) 있음.
🌟 예를들면, 배열(Array) 인스턴스의 특정 엘리먼트는 someArray[index]문법으로, 사전(Dictionary) 인스턴스의 특정 엘리먼트는 someDictionary[key]로 접근.
🌟 하나의 타입에 여러 서브스크립트를 정의할 수 있고 오버로드(Overload)도 가능.
🌟 뿐만아니라 단일 인자 값을 넘어, 필요 따라 복수 인자 값을 사용할 수 있음.