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학기) 한성현 교수님 강의 및 강의 자료 변형, 요약
'iOS > Swift이론' 카테고리의 다른 글
Swift)iOS프로그래밍 : 가감승제 함수, print format 소수점 (0) | 2021.10.22 |
---|---|
Swift) iOS프로그래밍 : 문법정리 (0) | 2021.10.17 |
swift)iOS 프로그래밍 : 클래스 상속(override)과 오버로딩 (0) | 2021.10.08 |
Swift) iOS 프로그래밍 : 클래스메서드, init(), 프로퍼티, 메서드 중첩, (0) | 2021.10.07 |
Swift) iOS 프로그래밍 함수, 1급객체, 클로저, 클래스 (0) | 2021.10.05 |