본문 바로가기

분류 전체보기242

14. 타입 체크와 변환 타입 체크와 변환 swift 언어는 강한 타입 체크 언어이므로 코드를 작성할 때 변수나 상수의 타입과 값의 타입을 잘 맞춰야 한다. 배열에 저장된 객체의 타입을 체크하려면 is 를 이용한다.// is 로 타입 체크let pets : [Animal] = [Dog("snu"), Cat("ya5ng"), Cat("laz")] if pets[0] is Cat { print("고양고양")} // pets는 배열이므로 직접 타입을 지정하면 에러 발생 let myCat : Cat = pets[1] 타입 변환은 as를 이용한다.as : swift1.1까지 사용.as? : 타입 변환에 실패하면 nil이 반환된다.as! : 타입 변환이 안되면 런타임 에러가 발생한다. Swift 1.2부터 사용 Any Swift의 모든 변.. 2015. 10. 14.
13. 옵셔널 체인 옵셔널 체인 옵셔널 체인은 nil로 인한 에러 없이 옵셔널 타입을 사용할 수 있는 장점이 있다.다음 코드의 프로퍼티에 접근하려면 if let을 사용해서 nil 체크를 해야 한다. 하지만 if let을 중첩 사용하면 옵셔널의 대가로 작성해야 하는 코드의 양이 너무 많다.class Person { var phone : MobilePhone?} class MobilePhone { var number : String?} let john = Person()if let phone = john.phone { // 전화 있음 if let number = phone.number { // 번호 있음 } } 강제 언래핑을 이용해서 할 수도 있다. 하지만 swift 2.0에서 이러한 방식은 불가능하도록 변경되었다.let nu.. 2015. 10. 14.
11. 클로저 클로저 클로저(Closure)는 동작하는 코드의 단위로, 코드가 정의된 곳의 변수나 상수를 사용할 수 있다. Objective-C의 블록(block)에 해당한다. 클로저를 정의하는 형식은 다음과 같다.{ ( PARAMETERS ) -> RETURN_TYPE in// 코드} 클로저를 사용하려면 함수 타입에 대해 익숙해져야 한다. 함수 타입은 파라미터의 타입과 개수, 반환 타입으로 구성된다.파라미터가 없고 반환값이 없는 함수 타입은 () -> () 혹은 void -> void 이다.// 함수 타입(Int, Int) -> Int // 함수 구현func add(i : Int, j : Int) -> Int { return i + j } 다음은 배열을 정렬하는 sort메소드에 클로저를 사용하도록 작성한 코드이다.v.. 2015. 10. 6.
10. 프로토콜 프로토콜 자바의 interface와 같은 기능을 하는, 메소드 호출 규격을 약속한 것이다. 그러므로 메소드의 선언만 작성하며 클래스나 구조체에 채택되어 사용한다.protocol Singing { func sing()} protocol Dancing { func dance()}// static method 선언protocol Species { static func species() -> String} // 클래스에 프로토콜 적용class Bird : Singing { func sing() { print("hahah") }} // 여러 프로토콜 적용class Cat : Singing, Dancing, Species { func sing() { print("hahahen") } func dance() { pr.. 2015. 10. 6.
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.