일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- swift
- weak var
- xcode로 날씨앱 만들기
- addannotation
- weatherKit
- 영문 개인정보처리방침
- 클로저의 캡슐화
- UIAlertAction
- font book
- Timer
- 러닝기록앱
- CoreLocation
- MKMapItem
- dispatchsource
- 서체관리자
- UICollectionViewFlowLayout
- WeatherManager
- 한국어 개인정보처리방침
- Required Reason API
- Protocol
- App Store Connect
- CLLocationManagerDelegate
- SwiftUI Boolean 값
- MKMapViewDelegate
- 단일 책임원칙
- AnyObject
- Xcode
- Startign Assignments
- 러닝타이머
- RunningTimer
- Today
- Total
VesselWheel
키오스크 프로그램에 사용된 protocol과 extension 본문
import Foundation
protocol Eatable {
var name: String { get set }
var description: String { get set }
var price: Double { get set }
func displayInfo()
}
extension Eatable {
func displayInfo() {
print("\(name) | W \(price) | \(description)")
}
}
1. protocol Eatable {}
Swift의 protocol은 특정 기능이나 속성을 정의하는 방법입니다. 이를 통해 클래스, 구조체, 열거형 등이 이 프로토콜을 채택(conform)하면 해당 프로토콜에 정의된 메서드, 속성 등을 구현해야 합니다.
예를 들어, 여기서 정의된 Eatable 프로토콜은 name, description, price라는 프로퍼티(속성)과 displayInfo라는 메서드를 가지고 있습니다. 이 프로토콜을 채택하는 타입은 반드시 이들을 구현해야 합니다.
2. 프로퍼티의 get과 set의 의미
get과 set은 Swift에서 속성(property)의 접근자(accessor)와 설정자(setter)를 나타냅니다.
get은 속성의 값을 가져오는 접근자를 정의합니다. 이는 해당 속성의 값을 읽을 수 있음을 의미합니다.
set은 속성의 값을 설정하는 설정자를 정의합니다. 이는 해당 속성의 값을 변경할 수 있음을 의미합니다.
따라서 get set이 함께 오는 경우, 해당 속성은 읽기와 쓰기가 모두 가능하다는 것을 의미합니다.
예를 들어, Eatable 프로토콜에서 name, description, price 속성은 get set이 정의되어 있으므로, 이 프로토콜을 채택하는 클래스, 구조체, 열거형에서는 이들 속성의 값을 읽고 쓸 수 있어야 합니다.
단, set은 클래스 내부에서만 사용 가능하며 외부에서는 읽기만 가능하게 하려면 { get }만 사용하면 됩니다. 이를 '읽기 전용'이라고 합니다.
3. extension Eatable {}
Swift의 extension은 기존의 클래스, 구조체, 열거형 또는 프로토콜 타입에 새로운 기능을 추가하려 할 때 사용합니다. 이를 통해 기존 타입을 수정하지 않고도 기능을 확장할 수 있습니다.
여기서 Eatable 프로토콜에 대한 extension은 displayInfo 메서드에 대한 기본 구현을 제공합니다. 이렇게 하면 Eatable 프로토콜을 채택하는 타입은 displayInfo 메서드를 직접 구현하지 않고, 이 기본 구현을 사용할 수 있습니다.
즉, Eatable 프로토콜을 채택하는 타입은 name, description, price 속성을 가지고 있어야 하며, displayInfo 메서드를 가지고 있거나 이 메서드에 대한 기본 구현을 사용할 수 있습니다. 이 메서드는 제품의 이름, 가격, 설명을 출력하는 기능을 합니다.
Extension 이란?
- 확장을 이용하여 structure, class, enum, protocol 타입에 새로운 기능을 추가할 수 있습니다.
- 기존 타입에 기능을 추가하는 수평 확장하는 개념입니다.
- 확장은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없습니다.
- 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 확장을 사용할 수 있습니다.
extension 확장할 타입 이름 {
//타입에 추가될 새로운 기능 구현
}
extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 {
//프로토콜 요구사항 구현
}
Extension으로 구현 가능한 것들:
- 새로운 계산된 속성(Computed Property) 추가
- 새로운 인스턴스/타입 메서드 추가
- 새로운 초기화(Initializer) 추가
- 프로토콜 채택(Protocol Conformance)
- 서브스크립트 추가(Subscripting)
- 중첩 타입(Nested Type) 추가
//
// main.swift
// Extension
//
// Created by Jason Yang on 12/13/23.
//
import Foundation
// 1. 새로운 계산된 속성(Computed Property) 추가
// String 타입에 확장하여 문자열의 길이를 반환하는 속성 추가
extension String {
var length: Int {
return self.count
}
}
let str = "Hello" //str이라는 변수에 Hello를 넣고 String의 길이를 숫자로 반환하는 length 라는 확장자
print(str.length) // 출력: 5
// 2. 새로운 인스턴스/타입 메서드 추가
// Int 타입에 확장하여 제곱 값을 반환하는 메서드 추가
extension Int {
func squared() -> Int {
return self * self // self는 3이다.
}
}
let number = 3
print(number.squared()) // 출력: 9
// 3. 새로운 초기화(Initializer) 추가
// Double 타입에 확장하여 특정 숫자로 초기화하는 초기화 메서드 추가
extension Double {
init(fromString str: String) {
self = Double(str) ?? 0.0 // 실패하면 0.0을 기입
}
}
let value = Double(fromString: "3.14")
print(value) // 출력: 3.14
// 4. 프로토콜 채택(Protocol Conformance)
protocol Printable {
func printDescription() // printDescription이라는 함수를 정의
}
struct MyStruct {}
// Extension을 사용하여 기존 타입 MyStruct에 Printable 프로토콜 채택(printDescription 매소드를 필수 구현)
extension MyStruct: Printable {
func printDescription() {
print("Printing description of MyStruct")
}
}
let myInstance = MyStruct()
//myInstance 인스턴스에 프로토콜 Princtable의 매소드 printDescriotion을 채택 출력
myInstance.printDescription() // 출력: Printing description of MyStruct
// 5. 서브스크립트 추가(Subscripting)
struct Matrix {
private var data: [[Int]] // 내부 프로퍼티 data는 인트값을 이중배열로 주입되어 있음
init(rows: Int, columns: Int) {
data = Array(repeating: Array(repeating: 0, count: columns), count: rows)
}
}
extension Matrix {
// Extension을 사용하여 서브스크립트 추가 // row, clumn 을 파라미터로 받고 return값을 Int값으로 출력함
subscript(row: Int, column: Int) -> Int {
get {
return data[row][column]
}
set {
data[row][column] = newValue
}
}
}
/* 서브스크립트(subscript)를 통해 Matrix 구조체의 요소에 접근하여 값을 설정하고 가져오기 때문입니다.
서브스크립트는 인덱스를 사용하여 값을 설정하고 가져오는 편리한 방법을 제공합니다.
예를 들어, matrix[0, 0] = 1은 첫 번째 행의 첫 번째 열에 1을 설정하고, matrix[1, 1] = 2는 두 번째 행의 두 번째 열에 2를 설정합니다.
*/
var matrix = Matrix(rows: 3, columns: 3) //Matrix 구조체를 파라미터 3, 3으로 초기화해줌
matrix[0, 0] = 1
matrix[1, 1] = 2
print(matrix[0, 0]) // 출력: 1
print(matrix[1, 1]) // 출력: 2
// 6. 중첩 타입(Nested Type) 추가
struct Container {
// 기존 타입 Container 내에서 중첩된 구조체 NestedType 타입
struct NestedType {
var value: Int
}
}
// Extension을 사용하여 중첩 타입 추가
extension Container { // Container 구조체 타입 내에
struct AnotherNestedType { // 중첩된 AnotherNestedType 탑 구조체 추가
var name: String
}
}
let nested = Container.NestedType(value: 5)
print(nested.value) // 출력: 5
let anotherNested = Container.AnotherNestedType(name: "NestedType")
print(anotherNested.name) // 출력: NestedType
Extension으로 구현 불가능한 것들:
- 저장 프로퍼티(Stored Property) 추가: Extension으로는 저장 프로퍼티를 추가할 수 없습니다. 오직 계산된 프로퍼티만 추가할 수 있습니다.
- 기존 기능의 재정의(Override): 이미 존재하는 기능을 Extension에서 재정의(Override)할 수 없습니다. 상속과 재정의는 클래스에서만 가능합니다.
- 초기화 메서드(Initializer)의 재정의: Extension으로는 새로운 편의 초기화 메서드를 추가할 수 있지만, 기본 초기화 메서드 또는 지정 초기화 메서드를 재정의할 수는 없습니다.
- 기존 타입의 저장된 프로퍼티에 기본값 설정: Extension에서는 기존 타입에 저장된 프로퍼티에 기본값을 설정할 수 없습니다.
//
// main.swift
// Extension_2
//
// Created by Jason Yang on 12/13/23.
//
import Foundation
// 1. 저장 프로퍼티(Stored Property) 추가
// Extension으로 저장 프로퍼티 추가 시 컴파일 에러 발생
extension Int {
var newProperty: Int = 5 // 컴파일 에러 발생
}
// 2. 기존 기능의 재정의(Override)
// Extension으로 기존 메서드 재정의 시 컴파일 에러 발생
extension Int {
func description() -> String { // 컴파일 에러 발생
return "This is an extension method"
}
}
// 3. 초기화 메서드(Initializer)의 재정의
// Extension으로 기존 타입의 초기화 메서드 재정의 시 컴파일 에러 발생
extension String {
init() { // 컴파일 에러 발생
self = "Default Value"
}
}
// 4. 기존 타입의 저장된 프로퍼티에 기본값 설정
// Extension으로 기존 타입의 저장된 프로퍼티에 기본값 설정 시 컴파일 에러 발생
extension Double {
var defaultValue: Double = 10.0 // 컴파일 에러 발생
}
'Xcode Study' 카테고리의 다른 글
UIPickerView와 protocol & delegate (0) | 2023.12.12 |
---|---|
Xcode 시작하기 - 화면 - Interface (1) | 2023.12.11 |
키오스크 프로그램(lv3) (0) | 2023.12.06 |
키오스크 프로그램(lv1) (0) | 2023.12.06 |
키오스크 프로그램과 클로져 (0) | 2023.12.05 |