-
Swift #12 - 구조체와 EnumSwift의 온도 2021. 1. 20. 01:01
1. 구조체
- 객체지향 프로그래밍
#애플리케이션에서 다루는 데이터와 행위
#클래스로 작성하기
*클래스와 메소드, 프로퍼티
#클래스 외 다른 선택
*구조체
*Enum
- 구조체 정의
*struct [구조체 이름] {}
*좌표를 다루는 구조체 Point 작성
*프로퍼티와 메소드
struct Point {var x = 0var y =0func description() -> String {return "Point : \(x), \(y)"}}cs - 구조체 사용
#구조체 객체
*객체 생성과 사용var p1 = Pointp1.x = 10p1.y = 20*프로퍼티를 자동으로 초기화하는 객체 생성var p2 = Point(x:3, x:5)cs - 구조체 초기화
#구조체 객체 초기화
*초기화가 필요한 프로퍼티struct Point {var x : Intvar y : Int}*프로퍼티 자동 초기화 Initializervar obj2 = Point(x: 10, y : 10)*Initializer 작성struct Point {var x : Intvar y : Intinit() {self.x = 0self.y = 0}}*프로퍼티 자동 초기화 Initializer 사용 불가var obj = Point()cs #구조체의 Initializer
*Initializer 없이 프로퍼티 초기화 가능
#구조체의 Designated Initializer
*상속 없으므로 부모 클래스로 초기화 위임 없음
#구조체의 Convenience Initializer
*Convenience 키워드 생략
*Initializer delegation 작성
#구조체의 Initializer
struct MyStruct {var value : Int//Designated Initializerinit(v : Int) {self.value = v}//convenience Initializerinit() {self.init(v:0)}}cs - Mutating
#구조체의 프로퍼티 수정
*초기화 메소드에서 설정 가능
*구조체 외부에서 설정 가능
#구조체 프로퍼티 수정 메소드
*메소드 선언에 mutating 추가
#구조체 내부에서 데이터 수정
*컴파일 에러 발생struct Point {var x = 0var y = 0func moveTo(x : Int, y : Int)self.x = x//에러self.y = y//에러}}*메소드에 mutating 선언struct Point {var x = 0var y = 0mutating func moveTo(x : Int, y : Int)self.x = xself.y = y}}cs *원소의 값 : rawValue*rawValue에서 Enum 생성(옵셔널)var ael = Pet(rawValue: 0)*Enum에서 rawValue 얻기ael.rawValuecs - 다른 구조체 타입 : Array
#배열 : struct Array
*배열 내용 유지 - 새로운 배열 생성 APIfunc map<U>(transform:(T) -> U) -> [U]func reverse() -> [T]func filter(includeElement: (T) -> Bool) -> [T]*배열 내용 변경 APImutating func insert(newElement: T, atIndex i: Int)mutating func remove(at index: Int) -> Tcs - 정적 메소드와 정적 프로퍼티
*static 키워드*정적 저장, 정적 계산 프로퍼티struct MyStruct {static func staticFunc() {print("정적 메소드")}static var staticProperty : Int!}MyStruct.staticFunc()MyStrunt.staticProperty = 10cs 2. 클래스와 구조체
- 클래스와 구조체
#구조체와 클래스 모두 있는 것
*프로퍼티와 메소드
*초기화(Initializer)
#구조체에는 없고 클래스에 있는 것
*상속과 재정의
*ARC
#레퍼런스(Reference) 타입과 밸류(Value) 타입
*클래스, 구조체, 레퍼런스 타입, 밸류 타입
#객체 대입
*클래스 : 참조 복사
*구조체 : 복사
*클래스 : 객체 참조 추가let obj1 = MyClass()let obj2 = obj1*구조체 : 복사let struct1 = MyStructure()let struct2 = struct1cs - 레퍼런스 타입(class)
#객체 공유
class MyClass {var value = 0}var obj1 = MyClass()var obj2 = obj1obj1.value = 10obj2.valuecs - 밸류 타입(struct)
#객체 복사
struct MyStruct {var value = 0}var obj3 = MyStruct()var obj4 = obj3obj3.value = 10obj4.valuecs - 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 amcase pm}enum Pet {case cat, dog, other}*Enum 사용var now : Daynow = Day.amnow = Day.pmcs - Enum과 switch
*switch와 사용*타입 정보가 있는 곳 - Enum 이름 생략var now : Day.amswtich 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.rawValuecs - Enum : 프로퍼티와 메소드
#프로퍼티(계산)와 메소드
enum Pet : Int {case cat, dogvar 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 : Pointvar size : Sizeinit() { // 초기화 코드 }}cs #중첩 타입 접근
let point = Rectangle.Point(x: 10, y: 10)let size = Rectangle.Size(width: 100, height: 100)cs 'Swift의 온도' 카테고리의 다른 글
Swift #14 - 프로토콜, extension (0) 2021.01.22 Swift #13 - 클로저 (0) 2021.01.21 Swift #11 - 메모리 관리 (0) 2021.01.19 Swift #10 - 상속 (0) 2021.01.15 Swift #9 - 객체 초기화 (0) 2021.01.14