본문 바로가기

Swift29

9. 구조체와 enum 구조체 구조체는 클래스처럼 프로퍼티와 함수를 선언한다. 클래스와 마찬가지로 구조체 객체를 생성하면서 구조체에 선언한 프로퍼티 값을 초기화해야 한다. 다만 convenience initializer의 경우 메소드에 convenience를 작성하지 않는다. 구조체는 상속을 지원하지 않으므로 부모 클래스로의 초기화 위임을 하지 않는다.struct Point { var x : Int var y : Int init() { self.x = 0 self.y = 0 }} var obj = Point() Mutating 구조체는 객체를 생성한 이후 구조체 내부에서 구조체 값을 변경할 수 없다. 초기화 메소드를 제외한 다른 메소드에서 프로퍼티 값을 설정할 수 없다. 구조체 내부에서 객체의 값을 변경하려면 메소드에 muta.. 2015. 10. 6.
8. 상속 상속과 초기화 메소드 상속했을 경우 부모 클래스와 자식 클래스에서 초기화 메소드가 동작하는 모습으로 두 종류의 초기화 방식이 다른다. 쉽게 표현하자면 Designated는 위(super)로 위임하도록 작성하고 Convenience는 옆(other Convenience or Designated)으로 위임하도록 작성한다. 초기화 메소드 상속 초기화 메소드는 자식 클래스에 제한된 경우에만 상속된다. 상속되는 첫 번째 조건은 자식 클래스에 Designated Initializer가 없는 경우다. 클래스에 그것이 없다는 것은 별도의 초기화가 필요한 프로퍼티를 선언하지 않았다는 것이다. 자식 클래스에 Convenience Initializer를 작성해도 초기화 상속이 발생한다. 자식 클래스의 객체를 생성하려면 부모.. 2015. 10. 5.
7. 메모리 관리 ARC(Automatic Reference Counting) 객체를 소유한 전체 개수를 파악하기 위한 레퍼런스 카운트(Reference Count)가 있다. 이 레퍼런스 카운트를 자동으로 관리하는 기술이 ARC이다. 레퍼런스 카운트는 클래스에 기반한 레퍼런스 타입에만 적용된다. 원시 타입이나 구조체(Struct), Enum타입은 ARC대상이 아니다. 소유하기 객체를 소유하는 방법은 강한 포인터로 객체를 참조하는 것이다.var obj : MyClass? = MyClass() // 소유권을 해제하려면 nil을 할당해야 하므로 옵셔널이나 강제 언래핑으로 선언 obj = nil // 소유권 해제 소유권을 해제하는 것이 객체 해제를 의미하지는 않는다. 객체를 소유하는 포인터가 다수일 수 있다. 이 경우 객체를 생.. 2015. 10. 5.
6. 메소드 메소드(method) 객체의 행위를 클래스에 정의한 함수를 메소드라고한다.// 메소드의 예class Counter { var count = 0 func increment() { count++ } func reset() { count = 0 }} let counter = Counter()counter.increment() counter.reset() 파라미터 이름 메소드도 파라미터와 파라미터 이름을 사용한다. 클래스 내부에 작성하는 메소드에는 두 번째 파라미터부터 외부 파라미터 이름을 자동으로 사용한다. 별도로 외부 파라미터 이름을 지정하지 않으면 내부 파라미터 이름이 외부 파라미터 이름이 된다.class Counter2 { var count = 0 func incrementBy(amount: Int, n.. 2015. 10. 1.
5. Class 클래스 정의와 객체 생성 class ClassName { // to do} // 클래스 객체 생성 var cls = ClassName() 객체 비교 클래스에서 객체를 생성하면서 변수나 상수에 대입한다. 클래스는 value type인 숫나 문자열과 다르게 레퍼런스(Reference) 타입이다. 밸류 타입은 다른 변수나 상수에 대입하면 값을 복사하고 레퍼런스 타입은 값을 복사하지 않는다. 밸류 타입은 == 연산자를 이용해서 값을 비교하지만 같은 주소를 가지는 객체를 비교하려면 === 연산자를 사용한다.var obj1 = ClassName()var obj2 = obj1var obj3 = ClassName() obj1 === obj2 // true obj1 === obj3 // false 프로퍼티 객체가 다루는.. 2015. 9. 30.
4. 함수 함수 함수는 동작을 작성하는 단위로 func 키워드로 정의한다.// 함수의 정의func greeting() { print("hello") }// 함수 호출 greeting() 함수 반환값 함수의 동작 결과를 반환하려면 파라미터 오른쪽에 ->를 이용한다. 반환 타입이 없으면 생략 가능하다.func areOk() -> Bool { return true} func favorite() -> String { return "coffee" } 다수의 반환값 함수의 결과로 다수의 결과를 반환하려면 튜플을 사용한다.// 난수 3개를 튜플로 반환func random3() -> (Int, Int, Int) { let r1 = Int(arc4random() % 10) let r2 = Int(arc4random() % 10) .. 2015. 9. 30.
3. 옵셔널 옵셔널(Optional) Swift에서 일반적인 변수나 상수는 값이 설정돼있어야 한다. 값이 설정되지 않은 상태를 nil이라고 하고 옵셔널로 선언해야 한다.Swift에서 객체형 변수외에도 nil은 Int나 Float와 같은 원시 타입에도 사용할 수 있다. 그러나 다음과 같이 변수에 nil을 대입하는 방식은 에러가 발생한다. var i = nil // error nil을 다루려면 옵셔널 타입으로 선언해야 한다. 옵셔널로 변수나 상수를 정의하려면 타입에 물음표를 붙여서 선언하며 타입 선언을 생략할 수 없다.var i : Int? = nil 옵셔널 사용하기 nil에 함수를 호출하거나 프로퍼티를 접근하려고 하면 런타임 에러가 발생한다. 컴파일러는 nil이 될 수 있는 옵셔널 타입에 프로퍼티나 메소드를 호출하려고.. 2015. 9. 30.
2. 기본 문법과 타입 import import Foundationimport UIKit // iOS용 프로젝트, 플레이그라운드import Cocoa // OS X용 플레이그라운드 main 전통적으로 main파일의 main함수에서 애플리케이션이 시작하지만 Swift는 별도의 main함수를 작성하지 않는다. main 소스 코드의 글로벌 영역에서 시작. 세미콜론 Objective-C를 포함한 많은 프로그래밍 언어에서 문장 끝에 세미콜론(;)을 붙이지만 Swift에서는 생략할 수 있다. 단 한 줄에 여러 문장을 작성할 때는 세미콜론으로 구분.var i = 0; i = 1 공백 문자공백의 위치에 따라서 연산자를 다르게 인식한다. 일반적인 코드는 다음과 같지만 let i1 = 1 + 2 let i2 = 1+2 한 쪽만 붙여 사용할 경우.. 2015. 9. 21.
[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: [!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: 외부 라이브러리를 추가할 때 cocoapods를 이용하다보면 이런 메세지를 보는 경우가 있다.제대로 추가도 안되거니와, .lock파일이 생성이 안된다. 이유는 명확. 써 있는 대로 use_frameworks! 를 Podfile에 추가하면 된다. # Uncomment this line to define a global platform for your project# platform :ios, '6.0'pod ‘Googl.. 2015. 9. 8.