본문 바로가기

Swift/Swift Language

(15)
CLI에서 Swift 패키지 매니저 사용하여 swift 빌드하기 CLI에서 Swift 패키지 매니저 사용하여 swift 빌드하기 iOS개발을 하다가도 swift 언어로 라이브러리를 만들어서 배포해야할 경우가 종종 있습니다. swift 패키지 매니저는 라이브러리를 빌드하고 실행할 수 있는 파일을 만들어주는 기능을 가지고 있습니다. 먼저 스위프트 패키지 잘 설치되어 있는지 확인해보겠습니다. $ swift package --help OVERVIEW: Perform operations on Swift packages SEE ALSO: swift build, swift run, swift test USAGE: swift package ... 패키지 만들기 새로운 패키지를 만들어서 뼈대(skeletal) 파일들을 생성할 수 있습니다. 여기서는 Hello 라는 프로젝트 이름으로 ..
Swift Enum의 RawValue 제대로 사용하기 스위프트의 Enum은 다형성을 지원하는 타입이다. Enum의 rawValue를 String으로 사용할 때, 컴파일 시점에 안전하지 못하다. 예를 들어, 다양한 이미지 타입을 모델링하기 위해 다음과 같이 Enum을 정의하자. enum ImageType: String { case .jpg, .gif, .bmp, .unknown } ImageType의 rawValue를 읽어들어 어떤 적절한 값을 반환하는 함수를 정의하자. func toImageType(for type: String) -> String { guard let imageType = ImageType(rawValue: type) else { return "unknown" } switch imgeType { case .jpg : return "jpg ..
Swift의 Algebraic Data Type 대수적 데이터 타입(Algebraic Data Type)은 함수적 프로그래밍의 용어에서 나왔다. 대수적 데이터 타입은 데이터 타입이 대수적으로 표현되는 관점을 표현한 것으로, 크게 sum type과 product type이 존재한다. 스위프트의 대수적 데이터 타입 Sum Type에는 Enum이 있다. Prouct Type에는 Struct와 Tuple이 있다. 요일을 표현하는 데이터 타입을 구현해보자. enum으로 일요일부터 토요일까지 표현한다면, 다음과 같다. enum Day { case sunday case monday case tuesday case wednesday case thursday case friday case saturday } Day는 각각의 요일 case가 값을 0부터 6까지 표현하여..
Swift 언어 가이드 - 서브스크립트 Subscript 서브스크립트 Subscripts 클래스, 스트럭쳐, 이늄은 서브스크립트를 정의할 수 있습니다. 이것은 컬렉션의 멤버 원소에 접근할 때 사용하는 단축어입니다. 여러분은 서브스크립트를 이용하여 별도의 메서드 없이 인덱스 기반으로 값에 접근하거나 값을 저장할 수 있습니다. 예를 들어, Array 인스턴스의 원소에 접근하려면 someArray[index] 로 작성하거나 Dictionary 인스턴스의 원소에 접근하려면 someDictionary[key] 를 사용할 수 있습니다. 단일한 타입의 여러 서브스크립트를 정의하려면, 오버로드된 적절한 서브스크립트가 선택됩니다. 서브스크립트는 단일한 차원에만 국한되지 않으며 여러 입력 파라미터를 이용하여 커스텀 타입의 요구에 맞게 서브스크립트를 정의할 수 있습니다. 서브스크..
Swift 언어 가이드 - 클로져는 참조 타입이다 클로져는 참조 타입이다 클로져 값 캡쳐링에서 봤던 예제를 다시 살펴 보겠습니다. func makeIncrementer(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementer() -> Int { total += amount return total } return incrementer } let incrementBySeven = makeIncrementer(forIncrement: 7) incrementBySeven() // 7을 반환 let incrementByTen = makeIncrementer(forIncrement: 10) incrementByTen() incrementByTen() incrementByTen() ..
Swift 언어 가이드 - 값 캡쳐링 값 캡쳐링 클로져는 주위 문맥으로부터 상수와 변수를 캡쳐(capture)할 수 있습니다. 이후 클로져는 이 상수와 변수를 클로져 내부에서 참조하거나 수정할 수 있습니다. 심지어 원본의 상수와 변수가 더 이상 존재하지 않더라도 그렇습니다. 스위프트에서 값을 캡쳐링하는 클로져의 가장 간단한 형태는 중첩 함수입니다. 이 함수는 다른 함수 내부에 작성된 함수입니다. 중첩 함수가 바깥 함수의 인자 중 아무 값이나 캡쳐할 수도 있으며 바깥 함수에서 정의된 상수나 변수를 캡쳐할 수도 있습니다. 여기에 makeIncrementer 라고 정의된 함수가 있습니다. 이 함수는 중첩 함수, incrementer 를 가지고 있습니다. 중첩된 incrementer() 함수는 두 개의 값을 캡쳐합니다. 바로 runningTotal..
Swift 언어 가이드 - 트레일링 클로져 클로져 트레일링 만약 여러분이 함수에 클로져 표현식을 함수의 마지막 인자로 전달하고 싶다면, 트레일링 클로져(trailing closure)를 사용하는 것이 좋습니다. 트레일링 클로져는 함수 호출의 소괄호 이후 부터 작성합니다. 소괄호를 벗어나지만 여전히 그 함수의 인자로 인정됩니다. 트레일링 클로져 문법을 사용할 때, 클로져에 인자 레이블을 부여해서는 안됩니다. func someFunctionThatTakesAClousre(closure: () -> Void) { // 실행할 함수 내부 } // 트레일링 클로져 없이 함수를 호출 한다면? someFunctionThatTakesAClosure(closure: { // 실행할 클로져 내부 }) // 트레일링 클로져를 사용해 함수를 호출 한다면? someFu..
Swift 언어 가이드 - 클로져 기본 클로져 Closures 클로져 (Closure)는 함축적(self-contained) 기능들의 블럭입니다. 스위프트에서 클로져는 C와 Objective-C의 클로져 또는 다른 프로그래밍 언어의 람다(lambdas)와도 유사합니다. 클로져는 문맥(context)로부터 상수나 변수에 대한 참조들을 가져와서(캡쳐링, capturing) 저장할 수 있습니다. 이것을 변수나 상수들을 클로징 오버(closing over) 한다고 말합니다. 스위프트는 여러분을 대신하여 캡쳐링에 필요한 메모리 관리를 직접 수행합니다. 참고 만약 여러분이 캡쳐링에 대한 개념에 익숙하지 않아도 괜찮습니다. 값 캡쳐링 (Capturing Values)에서 자세한 정보를 확인하세요. 전역 함수와 중첩된 함수는 모두 클로져의 특별한 종류입니다..