스위프트 개발

에 대한 누락 된 매뉴얼
의 무료 사본을 다운로드하십시오.

스위프트 개발에 대해 배우는 20,000 명의 개발자 참여

무료 사본 다운로드

이를보고 있다면 스위프트 확장에 익숙하다고 가정합니다. 신속한 확장을 사용하면 형식,클래스,구조체,열거 형 또는 프로토콜에 기능을 추가 할 수 있습니다. 그러나 확장은 그보다 더 강력합니다. 이 에피소드에서는,나는 당신에게 스위프트 확장의 네 영리한 사용을 보여주고 싶습니다.

프로토콜 적합성

스위프트 프로그래밍 언어는 확장을 사용하여 기존 유형을 프로토콜에 부합 할 수 있다고 언급합니다. 이 새로운 또는 혁신적인 아니지만,그것은 또한 당신이 조직 코드를 유지하는 데 도움이 될 수 있습니다.

UITableViewDataSourceUITableViewDelegate프로토콜을 예로 들어 보겠습니다. 이 예는 친숙 해 보일 수 있습니다. 이것은 괜찮지 만 시간이 지남에 따라 탐색하기가 어려울 수있는 긴 클래스 구현이 발생합니다.

import UIKitclass ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ...}

형식이 준수하는 각 프로토콜에 대한 확장을 만들어 코드를 정리할 수 있습니다.

import UIKitclass ViewController: UIViewController { ...}extension ViewController: UITableViewDataSource { ...}extension ViewController: UITableViewDelegate { ...}

소스 파일을 탐색하는 것도 엑스 코드의 소스 편집기의 상단에있는 점프 바를 사용하는 습관을 만들 경우 쉽게된다.

소스 파일을 탐색하는 것도 엑스 코드의 소스 편집기의 상단에 점프 바를 사용하는 습관을 만들 경우 쉽게된다.

이니셜라이저 보존

크리스 아이드호프에서 다음 트릭을 배웠습니다. 이 예에서는 먼저 구조Person을 정의해야합니다. 구조는String,firstlast형식의 두 상수 속성을 정의합니다.

struct Person { // MARK: - Properties let first: String let last: String}

스위프트는Person구조의 인스턴스를 인스턴스화하는 데 사용할 수 있는 이니셜라이저인init(first:last:)을 아낌없이 만듭니다. 이것은 새로운 것이 아닙니다.

let john = Person(first: "John", last: "Doe")

구조체 정의에서 사용자 지정 이니셜라이저를 정의하면 이니셜라이저를 더 이상 사용할 수 없습니다.

struct Person { // MARK: - Properties let first: String let last: String // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

구조 정의에서 사용자 지정 이니셜라이저를 정의하면 이니셜라이저를 더 이상 사용할 수 없습니다.

다행히 이 문제를 쉽게 해결할 수 있습니다. 사용자 지정 이니셜라이저를 정의하는Person구조체에 대한 확장을 만듭니다.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

확장은 문제를 해결합니다.

코드 분리

이전 예제를 한 단계 더 진행할 수 있습니다. 몇 년 전 나타샤 무라 셰프는 확장을 사용하여 상태와 행동을 분리하는 기술을 설명했습니다. 이 기술을 이전 예제에 적용하면 결국 이와 같은 것으로 끝납니다.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" } // MARK: - Public API var asDictionary: { return }}

형식 정의는 저장된 속성만 정의합니다. 형식의 동작,즉 메서드 및 계산된 속성에 대한 확장이 만들어집니다. 그 결과 상태(저장된 속성)와 동작(메서드 및 계산 된 속성)이 명확하게 분리됩니다.

우리는 개인 행동에 대한 두 번째 개인 확장을 만들어이 한 단계 더 걸릴 수 있습니다.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { ...}private extension Person { ...}

코드 분리 및 구성은 확장을 사용하여 매우 쉽습니다. 나는 그것을 모든 시간을 사용. 당신이 목표-씨의 헤더 파일을 놓칠 경우,이 좋은 대안이다.

중첩 유형

스위프트 프로그래밍 언어에서는 확장을 통해 중첩 유형을 정의하고 사용할 수도 있다고 언급합니다. 그러나 나는이 기능이 저평가 느낌. 예를 들어 상수를 정의하기 위해 모든 스위프트 프로젝트에서 사용합니다.

몇 달 전에 비트 마스크를 사용하여 사용자 지정 컨트롤을 작성하는 방법에 대한 자습서를 게시했습니다. 이 자습서에서는 비트 마스크의 원시 값을 사용자 기본값 데이터베이스에 저장합니다.

// MARK: - [email protected] func scheduleDidChange(_ sender: SchedulePicker) { // Helpers let userDefaults = UserDefaults.standard // Store Value let scheduleRawValue = sender.schedule.rawValue userDefaults.set(scheduleRawValue, forKey: UserDefaults.Keys.schedule)}

문자열 리터럴을 사용하는 대신 상수를 사용합니다. 우리는UserDefaults클래스에 대 한 확장을 만들 경우,Keys없이 열거형을 정의 합니다. 열거 형은String,schedule형식의 정적 상수 속성을 정의합니다.

extension UserDefaults { enum Keys { static let schedule = "schedule" }}

당신이 나에게 묻는다면 결과는 아주 좋습니다. 코드베이스 전체에 흩어져있는 리터럴을 피하고 상수를 그룹화 할 수있을뿐만 아니라 상수를 네임 스페이스 할 수도 있습니다. 즉,상수는 기억하기 쉽고 의미가 있습니다.

UserDefaults.Keys.schedule

스위프트 3 의 출시와 함께 애플은 일부 프레임 워크에서 유사한 기술을 채택했다.

Notification.Name.UIApplicationWillTerminate

향후 계획

확장은 스위프트에서 매우 강력하며 이 자습서에서 보여준 기술은 가능한 것의 몇 가지 예에 불과합니다.

누락 된 매뉴얼
빠른 개발

의 무료 사본을 다운로드하십시오.

스위프트 개발에 대해 배우는 20,000 명 이상의 개발자 참여

무료 사본 다운로드

답글 남기기

이메일 주소는 공개되지 않습니다.