반응형
구조체와 클래스
지금까지 기본적인 Basic Type과 그것들을 어떻게 저장하는지 배웠다.
이 값들을 많이 저장 할 때, 서로 관계하는 값들을 한꺼번에 관리하거나 표현하고 싶을 때 어떻게 할까?
iOS강의 정보라면 강사정보, 강의 이름, 학생 수 등등 낱개 관리가 아니라 덩어리로 관리한다.
관계가 있는 여러 데이터를 묶어서 표현
Object = Data + Method
Structure VS Class
Structure | Class |
Value Types | Reference Types |
Copy | Share |
컴퓨터 안에 할당 되는 공간 Stack |
컴퓨터 안에 할당 되는 공간 Heap |
import SwiftUI
class PersonClass {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
struct PersonStruct {
var name: String
var age: Int
init(name: String, age: Int){
self.name = name
self.age = age
}
}
let pClass1 = PersonClass(name: "Jason", age: 5)
let pClass2 = pClass1
pClass2.name = "Hey"
pClass1.name //"Hey"
pClass2.name //"Hey"
var pStruct1 = PersonStruct(name: "Jason", age: 5)
var pStruct2 = pStruct1
pStruct2.name = "Hey"
pStruct1.name //"Jason"
pStruct2.name //"Hey"
더보기
Class는 새로운 변수에 할당 할때 하나의 인스턴스를 가리키고있지만
Struct는 새로운 변수에 할당 할때 기존에 있던 것을 새롭게 복사한 인스턴스를 가리킨다.
구조체 실습
더보기
// 문제: 가장 가까운 편의점 찾기
//
// 거리 구하는 함수
// func distance(current: (x : Int, y : Int), target: (x : Int, y : Int)) -> Double {
func distance(current: Location, target: Location) -> Double {
// 피타고라스
let distanceX = Double(target.x - current.x)
let distanceY = Double(target.y - current.y)
let distance = sqrt(distanceX * distanceX + distanceY + distanceY)
return distance
}
// 맨 처음 시작시.... 코드
struct Location {
let x: Int
let y: Int
}
struct Store {
let loc: Location
let name: String
let deliveryRange = 2.0
//배달가능한지보는 함수
func isDeliverable(userLoc: Location) -> Bool {
let distanceToStore = distance(current: userLoc, target: loc)
return distanceToStore < deliveryRange
}
}
// 현재 스토어 위치들
////let store1 = (x : 3, y : 5, name : "gs")
////let store2 = (x : 4, y : 6, name : "seven")
////let store3 = (x : 1, y : 7, name : "cu")
let store1 = Store(loc: Location(x : 3, y : 5), name : "gs")
let store2 = Store(loc: Location(x : 4, y : 6), name : "seven")
let store3 = Store(loc: Location(x : 1, y : 7), name : "cu")
// 가장 가까운 스토어를 구해서 프린트 하는 함수
/// func printClosestStore(currentLocation:(x:Int, y:Int), stores:[(x: Int, y:Int, name: String)]) {
// func printClosestStore(currentLocation: Location, stores:[(loc: Location, name: String)]) {
func printClosestStore(currentLocation: Location, stores:[Store]) {
var closestStoreName = ""
var closestStoreDistance = Double.infinity
var isDeliverable = false
for store in stores {
// let distanceToStore = distance(current: currentLocation, target: (x: store.x, y: store.y))
let distanceToStore = distance(current: currentLocation, target: store.loc)
closestStoreDistance = min(distanceToStore, closestStoreDistance)
if closestStoreDistance == distanceToStore {
closestStoreName = store.name
isDeliverable = store.isDeliverable(userLoc: currentLocation)
}
}
print("Closest store: \(closestStoreName), isDeliverable: \(isDeliverable)")
}
//Stores Array 세팅, 현재 내 위치 세팅
//// let myLocation = (x :2, y : 2)
let myLocation = Location(x :2, y : 2)
//let myLocation = Location(x: 2, y: 5)
let stores = [store1, store2, store3]
// printClosestStore 함수를 이용해서 현재 가장 가까운 스토어 출력하기
printClosestStore(currentLocation: myLocation, stores: stores)
//Closest store: gs
//---> Location struct >>> Closest store: gs
//----> Store struct >>> Closest store: gs
//-----> Closest store: gs, isDeliverable: false
//Improve Code
// - make Location struct
// - make Store struct
반응형
'모바일앱 > Swift' 카테고리의 다른 글
프로퍼티 vs 메소드 (0) | 2021.10.14 |
---|---|
프로퍼티 개념 (0) | 2021.10.13 |
프로토콜 (0) | 2021.10.13 |
Struct만들기 도전과제 (0) | 2021.10.12 |
Collection - Closure, Capturing Values (0) | 2021.10.10 |
Collection - Set (0) | 2021.10.10 |
Collection - Dictionary (0) | 2021.10.10 |
Collection - Array (0) | 2021.10.09 |