검색결과 리스트
willSet에 해당되는 글 1건
- 2015.11.30 [swift2] 키워드로 보는 Swift
글
[swift2] 키워드로 보는 Swift
Swift
2015. 11. 30. 21:33
Swift 에서 사용하는 예약어를 마인드맵으로 그려보았습니다. 예약어들을 보고 얼마나 알고 있고, 또 설명할 수 있는지 시험해보세요.
예약어 목록은 The Swift Programming Language 문서를 참고하였습니다.
선언에 사용되는 키워드
- import : 모듈(프레임워크)을 로드하여, 현재 파일에서 심볼을 접근할 수 있게함.
// UIKit 전체모듈 로드
import UIKit
// UIKit 모듈의 NSText 서브모듈만 로드
import UIKit.NSText
- class : 클래스 선언
- protocol : 프로토콜 선언
- extension : 클래스 확장
- typealias : 기존타입에 별칭을 부여합니다.
typealias AudioSample = UInt16
- enum : 열거형 선언
- struct 구조체 선언
- init : 생성자
- deinit : 소멸자
- func : 함수 정의
- var : 변수 정의해 사용하는 키워드
- let : 상수 정의해 사용하는 키워드
- static : 해당 타입의 모든 인스턴스가 공유하는 type 속성, 메소드 정의를 위한 키워드
value(struct, enum) 타입에는 static, 클래스 타입에는 class 키워드를 사용합니다. 클래스 타입의 저장속성 정의에서는 class 키워드를 지원하지 않습니다.
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 10
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 10
}
}
class SomeClass {
// class stored properties not yet supported in classes
// static var storedTypeProperty = "Some value."
class var computedTypeProperty:Int {
return 10
}
}
- subscript : 클래스, 구조체, 열거형의 속성을 인덱스 문법으로 접근하기 위한 인터페이스.
- internal
- public
- private
- inout : 함수 내부에서 변경된 인자값이 원래 변수값에 반영되야 할경우 사용하는 키워드
func swapTwoInts(inout a:Int, inout b:Int) {
let tmp = a
a = b
b = tmp
}
var a = 5
var b = 10
swapTwoInts(&a, b: &b)
// a = 10, b = 5
- operator
문장에 사용되는 키워드
- switch
- case
- break
- fallthrough : 코드 제어흐름을 다음(next) case 문으로 이동.
let ch = "a"
switch ch {
case "a":
print("a", terminator: " ")
fallthrough
case "b":
print("b", terminator: " ")
default:
print("unknown")
}
// a b 를 출력함
- default
- continue
- if
- else
- where
- for
- in
- do
- while
- return
- repeat : while 문과 조합하여 1번이상의 반복문을 수행. (기존의 do-while문)
var i = 0
repeat {
i++
} while i < 10
- defer : 실행흐름이 현재 코드블럭을 떠나기 전에 특정 문장집합을 실행하고 싶을 때 사용.
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
// 라인 처리
}
// 블럭을 빠져나가기 전 close(file)를 호출함.
}
- guard : 에러조건이 발생하여 메서드를 조기 종료하고 에러를 보고하기 위해 사용함.
func vend(itemNamed name: String) throws {
// 에러조건에서 미리 메소드를 종료하고, 에러를 보고
guard var item = inventory[name] else {
throw VendingMachineError.InvalidSelection
}
guard item.count > 0 else {
throw VendingMachineError.OutOfStock
}
// 정상흐름의 로직 처리
// ...
}
표현식과 타입
- is
- as
- dynamicType : 인스턴스의 타입 (런타임 시점에 타입을 반환함)
var car = Car()
// 인스턴스의 타입
print(car.dynamicType)
// Car
// self를 사용하여 타입을 알수도 있음.
print(Car.self)
- super
- self
- Self : 프로토콜 선언에서 사용되며, 해당 프로토콜을 구현한 구현체의 타입을 의미함
protocol Drawable {
func draw(drawable:Self)
// func draw(drawable:Drawable)
}
// Drawable 프토토콜을 구현한 Circle 구조체에서 Self = Circle.
struct Circle : Drawable {
var radus = 10
func draw(drawable:Circle) {
print("radus: \(self.radus)")
}
}
- __COLUMN__ : 시작열 번호를 나타내는 리터럴
- __FILE__ : 파일의 이름을 나타내는 리터럴
- __FUNCTION__ : 선언부의 이름을 나타내는 리터럴.
__LINE__ : 시작라인 번호를 나타내는 리터럴
try
- throws
- rethrows
- catch
특정문맥 예약어
- willSet
- didSet
- get
- set
- left
- right
- mutating
- nonmutating
- none
- prefix : 피연산자의 앞에 붙는 연산자를 나타내는 키워드 예) -i
- infix : 피연산자들 사이에 붙는 연산자를 나타내는 키워드 예) 1 + 2
- postfix : 피연산자의 뒤에 붙는 연산자를 나타내느 키워드 예) i++
struct Vector2D {
var x = 0.0, y = 0.0
}
prefix func - (vector:Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
func + (left:Vector2D, right:Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
postfix func ++ (inout vector:Vector2D) -> Vector2D {
vector.x++
vector.y++
return vector
}
var left = Vector2D(x: 1, y: 1)
var right = Vector2D(x: 1, y: 1)
left = -left
// left 는 x=-1, y=-1
var sum = left + right
// sum 은 x=0, y=0
sum++
// sum 은 x=1, y=1
precedence : 연산자 우선순위.
둘 이상의 연산자를 포함하는 식에서 연산자의 순서를 나타내는 값.
associativity : 결합성
동일한 우선순위를 갖는 연산자들을 포함하는 식에서 피연산자가 왼쪽 또는 오른쪽의 연산자와 그룹화 되는지 나타내는 값.
override
- unowned
- weak
- lazy : 프로퍼티를 처음 사용할 때까지, 초기화 되도록 함. (처음 사용할때까지 초기화를 지연시킴)
class DataImporter {
var fileName = "data.txt"
init() {
print("DataImporter init")
}
}
class DataManager {
lazy var importer = DataImporter()
}
let manager = DataManager()
manager.importer
// 처음 lazy 속성에 접근할 때 초기화됨.
- convenience : 클래스를 위한 convenience 생성자를 선언할때 사용함. convenience 생성자는 다른 convenience 생성자를 호출하거나, designated 생성자를 호출함 수 있음.
- dynamic : Objective-C 로 표현할수 있는 클래스 멤버에 적용. 멤버에 접근할 때 항상 Objective-C 런타임을 사용하여 디스패치하도록 함.
- final : 클래스에 적용하면 서브클래싱 할수 없으며, 클래스 멤버에 적용하면 서브클래스에서 오버라이드 할 수 없음.
- indirect : enum의 연관값의 데이터 구조를 재귀적으로 정의할수 있게함.
enum Tree {
case Empty
indirect case Node(value:Int, left:Tree, right:Tree)
}
let tree = Tree.Node(value: 0, left: Tree.Empty, right: Tree.Node(value: 1, left: Tree.Empty, right: Tree.Empty))
- required : required로 선언된 생성자는 반드시 하위클래스에서 convenience 생성자에서 호출되거나 또는 오버라이드 되야함.
class A {
var num:Int
required init(num:Int) {
self.num = num
}
}
class B:A {
}
class C:A {
convenience init(str: String) {
self.init(num:Int(str)!)
}
}
class D: A {
init(str:String) {
super.init(num: Int(str)! )
}
// 컴파일 에러 - 커스텀 designated 생성자를 정의했다면
// required init(num:Int)를 오버라이드 해야함.
}
- Type
'Swift' 카테고리의 다른 글
| [swift2.1] Array와 Dictionary 기초 (0) | 2015.12.22 |
|---|---|
| [swift2.1] Swift 프로토콜 지향 프로그래밍 2 (0) | 2015.12.09 |
| [swift2] 키워드로 보는 Swift (0) | 2015.11.30 |
| [swift2] Currying 함수 (0) | 2015.11.25 |
| [swift2] Core Image Filter 예제 (0) | 2015.11.10 |
| [swift2.1] Xcode7.1 Playground 변경사항 (0) | 2015.10.27 |