class Dog {
var name: String
init(name: String) {
self.name = name
}
}
let dog1 = Dog(name: "초코")
dog1.name
"dog1.name" // 이런식으로 접근하면 안될까?
// 위의 코드에서 굳이 필요성을 느끼지 못할 수 있지만,
class School {
var name: String
var affiliate: SmallSchool
init(name: String, affiliate: SmallSchool) {
self.name = name
self.affiliate = affiliate
}
}
class SmallSchool {
var classMember: Person
init(classMember: Person) {
self.classMember = classMember
}
}
class Person {
var name: String
init(name: String) {
self.name = name
}
}
// 예전방식으로 구현하려고 한다면========
//class Person: NSObject {
// @objc var name: String
// init(name: String) {
// self.name = name
// }
//}
// ==============================
let person1 = Person(name: "홍길동")
let smallSchool1 = SmallSchool(classMember: person1)
let school1 = School(name: "슈퍼고", affiliate: smallSchool1)
// 만약에 접근하기위해, 써야하는 코드가 늘어난다면...
let gildogsName = school1.affiliate.classMember.name
// 스위프트5의 방식
let namePath = \School.affiliate.classMember.name // 미리 경로를 지정 (keyPath)
school1[keyPath: namePath] // 딕셔너리방식(서브스크립트)로 접근
//let person2 = Person(name: "임꺽정")
//person2.name
//
//
//let gjName = person2.value(forKey: "name") as? String
//let gjName2 = person2.value(forKeyPath: #keyPath(Person.name)) as? String
//
//
//let path = #keyPath(Person.name)
//let gjName3 = person2.value(forKeyPath: path) as? String
class Dog {
var num = 1.0
@objc var doubleNum: Double {
get {
return num * 2.0
}
set {
num = newValue / 2.0
}
}
@objc func run() {
print("강아지가 달립니다.")
}
}
//let selector = <#T##Selector#>
// 문법적인 약속
// (계산)속성을 가르킬때
let eyesSelector = #selector(getter: Dog.doubleNum) // 계산(읽기) 속성
let nameSelector = #selector(setter: Dog.doubleNum) // 계산(쓰기) 속성
// 메서드를 가르킬때
let runSelector = #selector(Dog.run)
class Dog {
static let species = "Dog"
var name: String = ""
var weight: Double = 0.0
}
// ⬇︎ 붕어빵의 타입
let dog1: Dog = Dog()
// ⬆︎ 붕어빵
dog1.name = "초코"
dog1.weight = 10.0
let dog2: Dog = Dog()
dog2.name = "보리"
dog2.weight = 15.0
// ⬇︎ 붕어빵틀의 타입
let dog: Dog.Type = Dog.self
// ⬆︎ 붕어빵틀
let dogSelf: Dog.Type = type(of: dog1) // 붕어빵틀
Dog.species // "Dog"
Dog.self.species // "Dog"
class Person {
static let species = "인간"
var name: String = ""
}
// 인스턴스의 타입과 인스턴스
let person1: Person = Person()
person1.name = "홍길동"
// 인스턴스의 타입과 인스턴스
let person2: Person = Person()
person2.name = "임꺽정"
// 붕어빵틀의 타입 // 붕어빵틀의 메모리
let pSelf1: Person.Type = Person.self
let pSelf2: Person.Type = type(of: person1) // 타입의 타입 (붕어빵틀형식으로 메모리에 있어)
pSelf1.species // "인간"
pSelf2.species // "인간"
Person.species // "인간"
Person.self.species // "인간"
var num1: Int = 5 // 붕어빵
var num2: Int = 7
// (타입자체의) 타입속성
Int.max
Int.self.max
Int.zero
Int.self.zero
var numberSelf: Int.Type = Int.self
type(of: person1)
Person.self
/*:
---
* 메타타입을 선언하는 방법
---
*/
/**======================
tableView.register(<#T##cellClass: AnyClass?##AnyClass?#>, forCellReuseIdentifier: <#T##String#>)
try? decoder.decode(<#T##type: Decodable.Protocol##Decodable.Protocol#>, from: <#T##Data#>)
(참고) iOS 등버전, Swift버전에 따라
@available(iOS 11.0, *)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@available(iOS 11.0, *)
func doSomething() {
// (if, while, guard문으로도 사용 가능)
if #available(iOS 11.0, *) {
// iOS 11버전이상인 경우 적용 시킬 코드를 작성
} else {
// iOS 11버전미만인 경우 적용 시킬 코드를 작성
}
}
}