iOS/Swift이론

Swift)iOS프로그래밍 : extension, access modifier, enum

Sweetft 2021. 10. 15. 14:21

extension : class, struct, enum, protocol에 새 기능 추가

   하위 클래스 생성 or 참조하지 않고 기존 클래스에 메서드, initializer, 계산 프로퍼티 등 기능 추가

   extension 기존타입이름 {

      //새 기능

   }

extension Double {
    var double : Double {
        return self + self
    }
    var cubed : Double {
        return self * self * self
    }
}
let myNumber : Double = 2.5
print(myNumber.Double) //5.0
print(1.3.Double) //2.6
print(3.0.Cubed) //27.0

 

 

Swift 접근제어

access modifier(or access specifiers, 접근 수정자, 액세스 수정자, 액세스 지정자) : 객체 지향 언어에서 클래스, 메서드, 멤버에 어느 정도 접근할 수 있는 지를 설정하는 키워드

Swift의 접근 속성 : private(블럭 내부), fileprivate(소스 파일 내부), internal(생략 가능(default), 해당 모듈의 모든 소스 파일 내 사용o), public(모듈의 모든 소스파일, 정의한 모듈 가져오는 다른 모듈 소스파일), open(모듈 외부까지(클래스 및 클래스 멤버에만))

 

open class var blue : UIColor { get }

open : 모듈 외부까지 클래스에서 사용할 때 접근 가능

class : 클래스 프로퍼티

get : 읽기만 가능한 프로퍼티

* 읽기 쓰기 다 될 때는 get set

 

 

프로토콜 : 특정 클래스와 관련없는 함수(메서드)들의 선언 집합

class 클래스명 : 부모명, 프로토콜명1, 프로토콜명2, ...{ }

class 클래스명 : 프로토콜명{ }(부모 없을 때)

클래스, 구조체, 열거형(enum), extension에 프로토콜을 채택(adopt)한다.

 

class Score{
    var iOS : Double = 93.2
    func display(){
        print("iOS 점수 = \(iOS)")
    }
}
var cho = Score() //var cho : Score = Score()
cho.display()
print(cho.iOS)
protocol Score{ //보통 프로토콜명의 뒤에는 able이 붙음
    var iOS : Double { get set }
    func display()
}
class Student : Score {
    var iOS : Double = 94.3
    func display() {
        print("iOS 점수 = \(iOS)")
    }
}
var cho = Student() //var cho : Student = Student()
cho.display()
print(cho.iOS)

protocol 프로토콜명 ( : 부모1프로토콜, 부모2프로토콜){ //다중 상속 ok

   프로퍼티명

   메서드 선언 //선언만!

}

 

 

delegate (대리자, 조력자)

(대충 프로토콜의 친구라고 생각)

 

 

enum(열거형) : 관련된 데이터들이 멤버로 구성된 자료형 객체

enum 열거형명 {

   열거형 정의

}

 

 

프로토콜, 오버로딩, 오버라이딩, 상속 사용 예시

import Foundation
protocol Testable {
    func doubleAge(age : Int) -> Int
}
class TestClass {
    var height : Double
    var grade : Int
    func info(){
        print("학년=\(grade), 키=\(height)")
    }
    init(grade: Int, height: Double){
        self.grade = grade
        self.height = height
    }
}
class TestClass2 : TestClass, Testable { //클래스 상속과 프로토콜 채택
    func doubleAge(age : Int) -> Int {
        return age*2
    }
    init(grade: Int, height: Double, name: String, score: Int?){
        super.init(grade:grade, height:height)
        self.name = name
        self.score = score
    }
    var name : String = "익명"
    override func info() { //오버라이딩
        print("이름=\(name), 학년=\(grade), 키=\(height)")
    }
    var score : Int?
    func info(score: Int) { //오버로딩
        print("이름=\(name), 학년=\(grade), 키=\(height), 학점=\(score) ")
    }
}
var cho : TestClass2 = TestClass2(grade:2, height:178.2, name:"조땡땡", score:nil)
cho.info() //이름=조땡땡, 학년=2, 키=178.2
print(cho.doubleAge(age:23)) //46
var kim : TestClass2 = TestClass2(grade:1, height:155.0, name:"김뭐뭐", score:4)
kim.info(score: kim.score!)//이름=김뭐뭐, 학년=1, 키=155.0, 학점=4

 

참고 : iOS프로그래밍기초(21년-2학기) 한성현 교수님 강의 및 강의 자료 변형, 요약