Swift #12 - 구조체와 Enum
1. 구조체
- 객체지향 프로그래밍
#애플리케이션에서 다루는 데이터와 행위
#클래스로 작성하기
*클래스와 메소드, 프로퍼티
#클래스 외 다른 선택
*구조체
*Enum
- 구조체 정의
*struct [구조체 이름] {}
*좌표를 다루는 구조체 Point 작성
*프로퍼티와 메소드
struct Point {
var x = 0
var y =0
func description() -> String {
return "Point : \(x), \(y)"
}
}
|
cs |
- 구조체 사용
#구조체 객체
*객체 생성과 사용
var p1 = Point
p1.x = 10
p1.y = 20
*프로퍼티를 자동으로 초기화하는 객체 생성
var p2 = Point(x:3, x:5)
|
cs |
- 구조체 초기화
#구조체 객체 초기화
*초기화가 필요한 프로퍼티
struct Point {
var x : Int
var y : Int
}
*프로퍼티 자동 초기화 Initializer
var obj2 = Point(x: 10, y : 10)
*Initializer 작성
struct Point {
var x : Int
var y : Int
init() {
self.x = 0
self.y = 0
}
}
*프로퍼티 자동 초기화 Initializer 사용 불가
var obj = Point()
|
cs |
#구조체의 Initializer
*Initializer 없이 프로퍼티 초기화 가능
#구조체의 Designated Initializer
*상속 없으므로 부모 클래스로 초기화 위임 없음
#구조체의 Convenience Initializer
*Convenience 키워드 생략
*Initializer delegation 작성
#구조체의 Initializer
struct MyStruct {
var value : Int
//Designated Initializer
init(v : Int) {
self.value = v
}
//convenience Initializer
init() {
self.init(v:0)
}
}
|
cs |
- Mutating
#구조체의 프로퍼티 수정
*초기화 메소드에서 설정 가능
*구조체 외부에서 설정 가능
#구조체 프로퍼티 수정 메소드
*메소드 선언에 mutating 추가
#구조체 내부에서 데이터 수정
*컴파일 에러 발생
struct Point {
var x = 0
var y = 0
func moveTo(x : Int, y : Int)
self.x = x//에러
self.y = y//에러
}
}
*메소드에 mutating 선언
struct Point {
var x = 0
var y = 0
mutating func moveTo(x : Int, y : Int)
self.x = x
self.y = y
}
}
|
cs |
*원소의 값 : rawValue
*rawValue에서 Enum 생성(옵셔널)
var ael = Pet(rawValue: 0)
*Enum에서 rawValue 얻기
ael.rawValue
|
cs |
- 다른 구조체 타입 : Array
#배열 : struct Array
*배열 내용 유지 - 새로운 배열 생성 API
func map<U>(transform:(T) -> U) -> [U]
func reverse() -> [T]
func filter(includeElement: (T) -> Bool) -> [T]
*배열 내용 변경 API
mutating func insert(newElement: T, atIndex i: Int)
mutating func remove(at index: Int) -> T
|
cs |
- 정적 메소드와 정적 프로퍼티
*static 키워드
*정적 저장, 정적 계산 프로퍼티
struct MyStruct {
static func staticFunc() {
print("정적 메소드")
}
static var staticProperty : Int!
}
MyStruct.staticFunc()
MyStrunt.staticProperty = 10
|
cs |
2. 클래스와 구조체
- 클래스와 구조체
#구조체와 클래스 모두 있는 것
*프로퍼티와 메소드
*초기화(Initializer)
#구조체에는 없고 클래스에 있는 것
*상속과 재정의
*ARC
#레퍼런스(Reference) 타입과 밸류(Value) 타입
*클래스, 구조체, 레퍼런스 타입, 밸류 타입
#객체 대입
*클래스 : 참조 복사
*구조체 : 복사
*클래스 : 객체 참조 추가
let obj1 = MyClass()
let obj2 = obj1
*구조체 : 복사
let struct1 = MyStructure()
let struct2 = struct1
|
cs |
- 레퍼런스 타입(class)
#객체 공유
class MyClass {
var value = 0
}
var obj1 = MyClass()
var obj2 = obj1
obj1.value = 10
obj2.value
|
cs |
- 밸류 타입(struct)
#객체 복사
struct MyStruct {
var value = 0
}
var obj3 = MyStruct()
var obj4 = obj3
obj3.value = 10
obj4.value
|
cs |
- Swift의 밸류 타입
#밸류 타입
*Int, Double, Float, Bool
*String, Character
*Array
*Dictionary
*Set
*Struct, Enum
- 클래스와 구조체
#클래스와 구조체 중 무엇을 사용할까?
*iOS, macOS에서 사용하는 프레임워크 - 클래스 종속적인 API
#프로토콜 기반의 프로그래밍(POP)
*WWDC에서의 발표
*구조체와 프로토콜을 이용한 프로그래밍 기법
3. Enum
- Enum Type
#열거형(Enumeration Type)
*원소 중 하나의 값
*Enum 정의
enum Day {
case am
case pm
}
enum Pet {
case cat, dog, other
}
*Enum 사용
var now : Day
now = Day.am
now = Day.pm
|
cs |
- Enum과 switch
*switch와 사용
*타입 정보가 있는 곳 - Enum 이름 생략
var now : Day.am
swtich now {
case .am:
print("오전")
case .pm:
print("오후")
}
|
cs |
- Enum 타입
#Enum 원소 타입
*원소 타입 사용하기
*Int 타입 원소 값 설정 생략
enum Pet Int {
case cat = 0, dog, other
}
*Int타입 외 값 설정 생략 불가
enum Device : String {
case phone = "휴대폰", pad = "패드"
}
|
cs |
#원소 타입이 있는 Enum
*원소의 값 : rawValue
*rawValue에서 Enum 생성(옵셔널)
var ael = Pet(rawValue: 0)
*Enum에서 rawValue 얻기
ael.rawValue
|
cs |
- Enum : 프로퍼티와 메소드
#프로퍼티(계산)와 메소드
enum Pet : Int {
case cat, dog
var name : String {
switch self {
case.cat:
return "고양이"
case.dog:
return "강아지"
}
}
func description() -> String {
return self.name
}
}
|
cs |
4. 중첩 타입
#타입 내부에 타입 정의
*클래스, 구조체, Enum 내부에 타입 정의
struct Rectangle {
struct Point {
var x, y : Int
}
struct Size {
var width, height : Int
}
var origin : Point
var size : Size
init() { // 초기화 코드 }
}
|
cs |
#중첩 타입 접근
let point = Rectangle.Point(x: 10, y: 10)
let size = Rectangle.Size(width: 100, height: 100)
|
cs |