본문 바로가기

전체 글133

Swift의 API Design Guidelines 소개 Swift API 디자인 가이드라인은 Swift를 이용하여 개발할 때, 어떻게 명료하고, 사용하기 쉬운 API를 작성할 수 있을지에 대한 지침을 제공한다. 가이드라인의 원칙에 대해서 알아보자! 기본 원칙 1. 사용지점에서의 명료함 Swift에서 가장 중요한 것은 사용지점에서의 명료함이다. 메서드나 프로퍼티와 같은 요소들은 한 번만 선언되지만, 여러 번 사용되기 때문이다. 따라서 이들이 명확하고 간결하게 사용될 수 있도록 API를 디자인해야 한다. 디자인을 평가할 때는, 항상 사용 사례를 살펴보고, 문맥 내에서 명확하게 보이는지 확인해야 한다. 2. 명료함은 간결함보다 중요 Swift 코드는 간결하면 좋지만, 명료한 코드를 작성하는 것보다 중요하지 않다. 3. 모든 선언에 대한 주석 작성 모든 선언에.. 2023. 6. 12.
WWDC 2016 - Protocol and Value Oriented Programming in UIKit Apps 세션에 관하여 Model Layer dream은 우리의 모델이다. 'description', 'creature' 그리고 'effects' 를 가지고 있다. Model에서 클래스를 사용하는 것이 왜 문제가 될까? 참조타입은 암시적 공유를 하고 있기 때문에 'dream2' 의 'description' 을 변경하면 'dream1'의 'description' 도 암시적으로 변경된다. 따라서 'dream1' 의 원하지 않는 변경을 통해 버그가 발생할 수 있다. 관계도 이 다이어그램은 관계를 보여준다. 이런 관계 중 일부는 명시적이고 암묵적일 수 있고, 일부는 one-way 또는 two-way일 수 있으며, 일부는 dynamic 또는 static 할 수도 있다. 그리고 이 관계는 매우 복잡하다. 구조체를 사용하여 해결 값 타입을.. 2023. 6. 8.
프로토콜 지향 프로그래밍에 관하여 프로토콜 지향 프로그래밍 -프로토콜 지향 프로그래밍은 Swift에서 가장 핵심 패러다임 중 하나이다. Swift는 객체 지향 프로그래밍 패러다임을 지향하기도 하는데, 보통 객체 지향 프로그래밍은 대부분 클래스의 상속을 이용해서 타입에 공통적인 기능을 구현한다. 하지만 Swift 표준 라이브러리의 코드를 보면, 대부분 구조체로 기본 타입이 구현되어 있다. 클래스와 같은 참조타입을 사용하는 것은 참조 카운트, 동적 할당 등으로 인해 리소스가 비싸다. 또한 참조타입의 암시적인 공유로 인한 데이터 불일치 문제를 야기할 수 있다. 클래스의 상속 기능은 슈퍼클래스들에 대한 정보를 알고 있어야 하기 때문에 코드가 복잡해질 수 있다. 클래스의 비싼 리소스 한계점은 값 타입을 사용하여 해결할 수 있다. 하지만 값 타입만.. 2023. 6. 7.
Protocol과 associatedtype에 관하여 프로토콜과 제네릭 -제네릭은 유연하고 재사용 가능한 타입을 작성하는데 도움이 되는 범용 타입이다. 즉, 제네릭은 범용성을 위한 기능이다. 그럼 Protocol에서 범용성을 가지기 위해 제네릭을 사용하는건 어떨까요? protocol MyProtocol { //An associated type named 'T' must be declared in the protocol 'MyProtocol' or a protocol it inherits func performAction(with item: T) } 위 코드는 컴파일 오류를 발생시킨다. 이렇게 프로토콜에서 제네릭을 적용하는 것은 허용되지 않는다. 대신 프로토콜에서는 'associatedtype' 을 사용하여 제네릭과 같은 기능을 구현할 수 있다. associ.. 2023. 6. 6.
Protocol Composition에 관하여 Protocol Composition -Protocol Composition이란 타입이 여러 프로토콜을 묶어서 사용할 수 있는 기능이다. protocol CanFly { func fly() } protocol CanSwim { func swim() } struct Duck: CanFly, CanSwim { func fly() { print("오리 날다.") } func swim() { print("오리 수영하다") } } let duck = Duck() duck.fly() //"오리 날다." duck.swim() //"오리 수영하다" 위 코드에서 'Duck' 구조체는 'CanFly', 'CanSwim' 프로토콜 모두 준수한다. 따라서 각 프로토콜에 있는 기능들을 모두 사용할 수 있다. 메서드의 매개변수 .. 2023. 6. 6.
Protocol-Extension에 관하여 Protocol-Extension -프로토콜 확장은 프로토콜에 Extension을 사용하여 연산 프로퍼티나 메소드, 이니셜라이저 등을 추가할 수 있게한다. 그리고 이 프로토콜을 채택하는 타입은 요구사항을 구현하지 않고, 이 기능을 사용할 수 있다. protocol Run { func run() } struct Dog: Run { func run() { print("Run!!") } } struct Cat: Run { func run() { print("Run!!") } } struct Tiger: Run { func run() { print("Run!!") } } 위 코드를 보면 'Dog', 'Cat', 'Tiger' 모두 'Run' 프로토콜을 채택하고 있으며, 요구사항인 'run' 메서드를 모두 동일하.. 2023. 6. 5.