Type Casting(타입 캐스팅) 사용법 & 예제 Type Casting(타입 캐스팅) 이란? 인스턴스의 타입을 확인 하거나, 인스턴스의 타입을 슈퍼 클래스 혹은 서브 클래스타입처럼 다루기 위해 사용합니다. Swift에서의 타입 캐스팅은 ‘is’ 와 ’as’ 라는 연산자로 구현할 수 있으며, 이 두 연산자는 값의 타입을 확인하거나 다른 타입으로 변환하는 간단한 방법을 제공합니다. 사용 예제 Defining a Class Hierarchy for Type Casting [예제1] 타입 캐스팅을 활용하여 특정 클래스 인스턴스의 타입을 확인 class Person { var name: String //초기값이 업으므로 init 만들어준다 init(name: String) { self.name = name ..
CustomStringConvertible 사용법 & 예제 CustomStringConvertible란? 공식문서에는 CustomStringConvertible는 텍스트적인 표현을 커스터마이즈 하는 타입이라고 적혀있다. 사용 예제 그냥 구조체를 출력하면 기본 표현으로 출력된다 struct Point { let x: Int let y: Int } let p = Point(x: 21, y: 30) print(p) //Point(x: 21, y: 30) CustomStringConvertible 프로토콜을 정의하면, 사용자가 정의한 형태로 출력되는 것을 확인 가능 extension Point: CustomStringConvertible { var description: String { return "(\(x)..
문법 최적화(Syntax Optimization)_Closures 사용법 & 예제 Syntax Optimization 란? 기본적으로 구현되어 있는 메소드를 사용할때(Closure) 스위프트는 단순하게 작성된 코드를 선호한다. 문법 최적화 하여 클로저 작성시 5가지 규칙이 있습니다. 1. 이미 구현되어 있는 메소드 사용한다면 파라미터 형식, 리턴 형식 생략 가능 2. 파라미터 이름, in 생략 -> Shorthand Argument Name (ex) $0, $1, $n로 대체 3. 클로저에 포함된 코드가 단일 return 이라면 return 생략(implicit return) 4. 클로저가 마지막 파라미터라면 in line -> Trailing Closure() 뒤에 5. 괄호에 파라미터 없으면 괄호 생..
Clousure(클로저) 사용법 & 예제 Clousure(클로저)란? 비교적 짧고 독립적인 코드 조각, 자바에서는 ‘람다’라고도 불림 함수와 클로저는 서로 완전히 호환된다. 3가지 종류의 클로저가 있다. { (parameters) -> ReturnType in statements } { statements } 사용 예제 클로저 표현식 let c = { print("Hello, Swift") } // 파라미터가 없고 리턴형 없는 Closure c() //in으로 Closure Head , Body 구분 let c2 = { (str: String) -> String in return "Hello, \(str)" } let result = c2("Closure") //Closure에서는 Argument lab..
Method and Subscript 사용법 & 예제 [2/2] Subscript란? 클래스, 구조 그리고 열거형은 서브스크립트를 정의할 수 있는데 컬렉션, 리스트 또는 순열의 멤버 항목에 접근하기 위한 단축키임. 서브스크립트를 사용하여 설정과 검색을 위해 메소드를 나눌 필요 없이 인덱스로 값을 설정하고 검색함. 예를 들어 someArray[index]로 배열 인스턴스 항목과 someDictionary[key]로 딕셔너리 인스턴스 항목을 접근할 수 있음. 파라미터의 형식과 수에는 제한이 없으나 많아야 2개가 일반적 가변 파라미터 가능, 파라미터의 기본값 지정 불가능 값을 받아야 하기 때문에 리턴형 생략 불가능 get은 필수, set은 생략 가능 subscript(parameters) -> R..
Method and Subscript 사용법 & 예제 [1/2] 인스턴스(Instance) 메서드란? 인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻 합니다. 문법은 함수와 동일하고 차이점은 인스턴스를 통해 호출 한다는 것과 구현하는 위치 입니다. 함수는 특정형식에 연관 되지 않은 동작, 메소드는 특정 형식과 연관된 동작 func name(parameters) -> ReturnType { Code } instance.method(parameters) 사용 예제 클래스로 구현한 인스턴스 class Sample { var data = 0 static var sharedData = 123 func doSomething() { print(data) Sample.sharedData //Static 값에 ..
Mutating Keyword 사용법 & 예제 인스턴스 메서드란? 인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻 합니다. 인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행합니다. 인스턴스 메서드는 함수와 달리 특정 타입 내부에 구현하기 때문에 인스턴스가 존재 할 때만 사용할 수 있습니다. (이 점이 함수와 유일한 차이점) 자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경안써도 되지만, 구조체나 열거형 등은 값 타입이므로 , mutaitng 키워드를 붙여서 해당 메서드가 인스턴스 내부의 값을 변경 한다는 것을 암시 해야합니다. 사용 예제 struct LevelStruct { var level: Int = 0 { didSet ..
Initializers (초기화) 사용법 & 예제 Failable initializer 초기화 실패를 옵셔널로 처리하는 방법을 알아보겠습니다. 유형 1 Failable initializer는 초기화에 성공한다면 초기화된 인스턴스가 옵셔널 형태로 return 되고 실패한다면 nil을 return하게 됩니다. init?(parameter) { initialization } 유형 2 초기화 성공되면 (Non-optional) 인스턴스를 return하고 실패한다면 crash가 발생 init!(parameter) { initialization } 사용 예제 struct Position { let x: Double let y: Double init?(x: Double, y: Double) { guard x >= 0..
Initializers (생성자) 를 사용하는 이유 구조체 / 열거형 / 클래스와 같은 설계도를 기반으로 생성한 것을 ‘ 인스턴스’ 라고 합니다. 이 때 인스턴스의 초기화를 담당하는 것이 ‘생성자’ 입니다. 초기화를 사용하는 이유는 모든 속성을 기본값으로 초기화 해서 인스턴스를 기본값 상태를 만들기 위해서입니다. 확인은 생성자 실행 되었을때 모든 속성이 기본값을 가지고 있다는 뜻 입니다. (기본 값 없으면 초기화 실패) Default Initializer 아래와 같이 모든 속성이 초기화 되어 있을 경우 컴파일러가 기본 생성자를 생성해 주기 때문에 따로 작성 할 필요 가 없다. class Position { var x = 0.0 // 속성이 항상 동일한 값으로 초기화 될때 사용 하는 방법 var y = 0..
제네릭 (Generics Function)이란? 형식에 의존하지 않는 범용 코드 사용 코드의 재사용, 유지보수 용이 코드(예시) & 설명 Generic Function //두형식이 모두 INT여야 한다. //다른 형식이 필요하다면 개별적으로 만들어야 한다. -> 함수 구현 중복 func swapInteger(lhs: inout Int, rhs: inout Int) { let tmp = lhs lhs = rhs rhs = tmp } var a = 10 var b = 20 swapInteger(lhs: &a, rhs: &b) a b //Generic Function 사용하여 해결 -> 코드 작성량 비약적 감소 //T는 새로운 형식이 아니라 문맥에 따라 실제 형식으로 대체되는 place holder일 뿐이다 ..
익스텐션(Extension)이란? 이름 그대로 형식을 확장하는데 사용 확장 가능한 것 : Class / Structure / Enumeration / Protocol 멤버를 추가하는 것은 가능 하지만, 기존 멤버를 오버라이딩 하는 것은 불가능(상속을 통해 서브클래싱 해야됨) 코드(예시) & 설명 익스텐션 문법 //확장 가능한 멤버 종류 struct Size { var width = 0.0 var height = 0.0 } //구조체 확장 extension Size { var area: Double { return width * height } } let s = Size() s.width s.height s.area //프로토콜 구현 추가 extension Size: Equatable { //원본을 수정할..
프로토콜(Protocol)이란? 형식에서 제공하는 멤버 목록 프로토콜에 선언 되어있는 필 수 멤버를 모두 구현해야 한다(프로토콜을 채용한다) Protocols protocol protocolName { propertyRequirements methodRequirements initializerRequirements subscriptRequirements } protocol ProtocolName: Protocol, ... { } Adopting Protocols enum TypeName : ProtocolName, ... { } struct TypeName : ProtocolName, ... { } class TypeName : SuperClass, ProtocolName, ... { } Class-On..