Swift08 - 구조체
in Swift
구조체
- 클래스처럼 프로퍼티와 함수를 선언
- 클래스와 구조체
- 같은점 : 데이터, 행위
- 다른점 : 상속, 레퍼런스vs밸류, ARC(레퍼런스 타입만)
- 구조체 정의
////// 1
struct Point {
var x = 0
var y = 0
func description() -> String {
return "point : \(x), \(y)"
}
}
var p1 = Point()
p1.x = 10
p1.y = 20
var p2 = Point(x : 3, y : 5)
//// 2
struct MyStruct {
var var1 : Int = 0
}
class MyClass {
var var1 : Int = 0
}
var struct1 = MyStruct()
var struct2 = MyStruct(var1 : 10)
var obj = MyClass()
- 구조체도 객체 생성되면 - 초기화 필요
- 초기화 메소드 작성
- 구조체도 클래스와 마찬가지로 초기화 과정 필요
- 상속 없으므로 부모 클래스의 초기화 위임 없음
- convenience initializer : convenience 생략
struct Point {
var x = 0
var y = 0
init(){
self.x = 0
self.y = 0
}
func description() -> String {
return "point : \(x), \(y)"
}
}
- 정적 메소드와 프로퍼티 : static
- 객체를 생성하지 않고 사용하는 메소드
struct Point {
var x = 0
var y = 0
static func newPoint(x : Int, y : Int) -> Point {
var newObj = Point(x: x, y: y)
return newObj
}
}
- 구조체의 데이터
- 초기화 메소드에서 설정 가능
- 구조체 외부에서 설정 가능
- 구초제 내부에서 설정 불가 - mutating 으로 내부에서 데이터 설정
struct MyStruct {
var var1 : Int = 0
var var2 : String
init() {
self.init(str : "Hello")
}
init(str : String){
var2 = str
}
static var var3 = "Struct"
mutating func increase(){
var1++
}
}
class MyClass {
var var1 : Int = 0
var var2 : String
convenience init() {
self.init(str : "Hello")
}
init(str : String){
var2 = str
}
}
var struct1 = MyStruct()
var struct3 = struct1
struct1.var1 = 10 //var1 : 10, var2 : "Hello"
struct3 //var1 : 0, var2 : "Hello"
var obj = MyClass()
- struct, array, dictionary .. 밸류 타입
var array = [1,2,3]
var array2 = array
array += [4] //[1, 2, 3, 4]
array2 // [1,2,3]
Enum
- 열거형(Enumeration Type)
- 옵션 중 하나의 값
- 타입이 있는 Enum은 case로 할당된 값으로 다룰 수 있다
- 범위 벗어나면 nil -> 옵셔널
var ael = Pet(rawValue : 0)!
ael.rawValue
- 계산프로퍼티, 메소드 사용 가능
- 저장 프로퍼티는 불가능
- Association
enum Day : Int {
case AM
case PM
func desc() -> String{
switch self{
case .AM :
return "오전"
case .PM :
return "오후"
}
}
}
Day.AM
Day.PM
let e1 = Day(rawValue : 0)
Day.AM.rawValue
Day.AM.desc() //"오전"
- 프로퍼티와 메소드
enum Pet : Int {
case Cat = 0
case Dog
case Other
var name : String{
switch self {
case .Cat:
return "고양이"
case .Dog :
return "개"
default:
return "기타"
}
}
func description() -> String {
return self.name
}
}
var raz = Pet.Cat
raz.name //고양이
raz.description() //고양이