클래스 메서드
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man()
//kim.cM() Man 타입의 인스턴스가 호출하면 error
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM() //클래스 메서드는 클래스가 호출
//나이=1, 몸무게=3.5
//cM은 클래스 메서드입니다.
//scM은 클래스 메서드(static)
◼ 클래스명.클래스메서드()
◼ Man 타입의 인스턴스가 호출하면 error
designated initializer
class Man{
var age : Int = 1 //초깃값은 없어도 생략가능
var weight : Double = 3.5 //초깃값은 없어도 생략가능
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight
} //designated initializer
}
//var kim : Man = Man() //오류
//init()을 하나라도 직접 만들면 default
//initializer는 사라짐
var kim : Man = Man(yourAge:10, yourWeight:20.5)
// 클래스 이름 다음에 괄호가 있으면 그 클래스에 initializer를 호출하는 과정이다
//init(yourAge: Int, yourWeight : Double)호출
kim.display()
//나이=10, 몸무게=20.5
◼ 생성자에서 프로퍼티의 값들을 초기화하는 initializer
self
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age //프로퍼티 = 매개변수
self.weight = weight
}
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
//나이=10, 몸무게=20.5
class woMan{
var age1 : Int = 1
var weight1 : Double = 3.5
func display1(){
print("나이=\(age1), 몸무게=\(weight1)")
}
init(yourAge: Int, yourWeight : Double){
age1 = yourAge //self.age = yourAge
weight1 = yourWeight
}
}
var lim : woMan = woMan(yourAge:20, yourWeight:30.5)
lim.display1()
//나이=20, 몸무게=30.5
◼ 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self.을 붙임
◼ 프로퍼티 이름을 매개변수 이름과 같게 주게되면 매개변수 값이 프로퍼티에 들어가야하기 때문에 구별하기위해 사용
computed property의 getter와 setter , method overloading
class Tree{
var apple : Int = 1 //stored property
var mango : Double = 3.5 //stored property
var add1 : Int{ //computed property
get{ return apple-1 }
set{ apple = newValue + 1 }
}
var add2 : Double{
get{ return mango-1.3 }
set{ mango = newValue + 1.4 }
}
func display(){
print("첫번째=\(apple), 두번째=\(mango)")
}
init(apple: Int, mango : Double){
self.apple = apple
self.mango = mango
}
init(mango : Double){
self.mango = mango
}
}
var Ahn : Tree = Tree(apple:10, mango:20.5)
var Ahn1 : Tree = Tree(mango:34.3)
Ahn.display()
Ahn1.display()
print(Ahn.add1) // getter호출
print(Ahn.add2)
Ahn.add1 = 3 //setter호출
Ahn.add2 = 5.0
print(Ahn.apple)
print(Ahn.mango)
//첫번째=10, 두번째=20.5
//첫번째=1, 두번째=34.3
//9
//19.2
//4
//6.4
◼ computed property - property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값으로 계산 프로퍼티 내에는 값을 리턴하는 게터(getter) 메서드와 값을 대입하는 세터(setter) 메서드가 있다.
◼ 매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의
failable initializer
class Tree{
var apple : Int
var mango : Int
func display(){
print("첫번째=\(apple), 두번째=\(mango)")
}
init?(apple: Int, mango : Int){
if apple <= 0 {
return nil
}
else if mango <= 0{
return nil
}
else{
self.apple = apple
}
self.mango = mango
}
}
var Ahn : Tree? = Tree(apple:1, mango:3)
//1-1.옵셔널 형으로 선언
if let Ahn1 = Ahn { //1-2.옵셔널 바인딩
Ahn1.display()
}
//2.인스턴스 생성과 동시에 옵셔널 바인딩
if let Ahn2 = Tree(apple:-2, mango:5) {
Ahn2.display()
}
if let Ahn3 = Tree(apple:4, mango:7) {
Ahn3.display()
}
if let Ahn4 = Tree(apple:1, mango:-5) {
Ahn4.display()
}
//3.인스턴스 생성하면서 바로 강제 언래핑
//var Ahn5 : Tree = Tree(apple:3, mango:-7)! error
//Ahn5.display()
//4.옵셔널 인스턴스를 사용시 강제 언래핑
//var Ahn6 : Tree? = Tree(apple:4, mango:10) error
//Ahn6!.display()
//var Ahn7 : Man = Man(age:0, weight:7.5)! error
//Ahn7.display()
//첫번째=1, 두번째=3
//첫번째=4, 두번째=7
◼ failable initialize가 있는 클래스의 인스턴스 생성 방법
◼ 강제 언레핑하는 방법은 위험하고 에러가 날 수 있음
init() [iOS UIKit class hierarchy]
let myChoose : UIColor = UIColor(hue: 0, saturation: 1, brightness: 0.5, alpha: 1.5)
let Color = UIColor(displayP3Red: 1, hue: 0, brightness: 0)
let myChoose : UIColor? = UIColor(named: "hello")
let myChoose : UIColor = UIColor(named: "hello")!
◼ 같은 이름의 init 함수가 여러 개 있는 것으로 매개변수가 다른 두 생성자를 통해 두 가지 방법으로 인스턴스를 만들 수 있음
◼ init?(named: String)
init?로 만든 인스턴스는 옵셔널 형으로 만들어져서, 사용하려면 옵셔널을 언래핑해야함
클래스 상속
class Tree{
var apple : Int
var mango : Double
func display(){
print("사과 갯수=\(apple), 망고갯수=\(mango)")
}
init(apple: Int, mango : Double){
self.apple = apple
self.mango = mango
}
}
class Student : Tree {
var taste : String
func displayS() {
print("과일 \(taste), 사과 갯수=\(apple), 망고갯수=\(mango)")
}
init(apple: Int, mango : Double, taste : String){
self.taste = taste
super.init(apple:apple, mango:mango) // 안쓰면 error
}//error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(apple:10,mango:34.5,taste:"맛있겠다")
lee.displayS()
lee.display()
//과일 맛있겠다, 사과 갯수=10, 망고갯수=34.5
//사과 갯수=10, 망고갯수=34.5
◼ 상속은 클래스만 가능
◼ super : 부모 메서드 호출 시 사용
◼ 부모와 자식에 같은 메서드가 있으면 자식 우선
'iOS' 카테고리의 다른 글
맥(Mac) (0) | 2021.11.02 |
---|---|
Swift 문법 (extension / 접근 제어 / protocol / enum) (0) | 2021.10.19 |
Swift 문법 (1급 객체 / 1급 시민 / 글로저 / 클래스 기초) (0) | 2021.10.05 |
Swift 문법 (guard / switch-case / 함수) (0) | 2021.09.28 |
옵셔널(optional) / 연산자(operator) / 제어문 (0) | 2021.09.21 |