alamofire objectmapper library 를 사용해서 파파고 번역 구현하기입니다.



//

//  PapagoDTO.swift

//  Papago

//

//  Created by stayfoolish on 2018. 9. 25..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit

import ObjectMapper


class PapagoDTO: Mappable {

    

    var message : Message?

    

    required init?(map: Map) {

        

    }

    

    func mapping(map: Map) {

        message <- map["message"]

    }

    

    class Message : Mappable{

        

        var result : Result?

        

        required init?(map: Map) {

            

        }

        

        func mapping(map: Map) {

            result <- map["result"]

        }

        class Result : Mappable{

            

            var translatedText : String?

            

            required init?(map: Map) {

                

            }

            

            func mapping(map: Map) {

                translatedText <- map["translatedText"]

            }

            

            

        }

        

        

    }


}


//

//  ViewController.swift

//  Papago

//

//  Created by stayfoolish on 2018. 9. 25..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit

import Alamofire

import AlamofireObjectMapper


class ViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        

        var url = "https://openapi.naver.com/v1/papago/n2mt"

        var params = ["source":"ko",

                      "target":"en",

                      "text":"만나서 반갑습니다."]

        var header = ["Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",

                      "X-Naver-Client-Id":"Jx1o3o2eyOTv_odH_gNw",

                      "X-Naver-Client-Secret":"ewr_h8Gsgv"]

        

        Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: header).responseObject { (response:DataResponse<PapagoDTO>) in

            var papagoDTO = response.result.value

            print((papagoDTO?.message?.result?.translatedText)!)

        }

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}






import Swift


/*

- 스위프트 타입 캐스팅

 인스턴스의 타입을 확인하는 용도

 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인 용도

 is, as를 사용합니다.

 * 형변환은 'ex. let someDouble = Double(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것입니다.

 

 */




// 예제 클래스


class Person {

    var name: String = ""

    func breath(){

        print("숨을 쉽니다")

    }

}


class Student: Person {

    var school: String = ""

    func goToSchool(){

        print("등교를 합니다")

    }

}


class UniversityStudent: Student{

    var major: String = ""

    func goToMT(){

        print("멤버쉽 트레이닝을 갑니다 신남!")

    }

}


// 인스턴스 생성


var myName: Person = Person()

var myName2: Student = Student()

var myName3: UniversityStudent = UniversityStudent()



// 타입확인


var result: Bool

result = myName is Person // true

result = myName is Student // false

result = myName is UniversityStudent // false


result = myName2 is Person // true

result = myName2 is Student  // true

result = myName2 is UniversityStudent // false


result = myName3 is Person // true

result = myName3 is Student // true

result = myName3 is UniversityStudent // true


if myName is UniversityStudent {

    print ("myName은 대학생입니다.")

}else if myName is Student {

    print("myName은 학생입니다")

}else if myName is Person {

    print("myName은 사람입니다")

} // myName은 사람입니다.


switch myName3 {

case is Person:

    print("myName3은 사람입니다")

case is Student:

    print("myName3은 학생입니다.")

case is UniversityStudent:

    print("myName3은 대학생입니다.")

default:

    print("myName은 사람도, 학생도, 대학생도 아닙니다.")

} // myName3은 사람입니다.





switch myName3 {

case is UniversityStudent:

    print("myName3은 대학생입니다")

case is Student:

    print("myName3은 학생입니다.")

case is Person:

    print("myName3은 사람입니다.")

default:

    print("myName은 사람도, 학생도, 대학생도 아닙니다.")

} // myName3은 대학생입니다.


/*

- 업 캐스팅 (Up Casting)

 as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.

 Any혹은 AnyObject로도 타입정보를 변환할 수 있습니다.

 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방합니다.

 */


//UnversityStudent 인스턴스를 생성하며 Person 행세를 할 수 있도록 업 캐스팅

var mike: Person = UniversityStudent() as Person


var jenny: Student = Student()

// var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류


// UniversityStudent 인스턴스를 생성하며 Any 행세를 할 수 있도록 업 캐스팅

var jina: Any = Person() // as Any 생략가능


/*

 - 다운 캐스팅(Down Casting)

 as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해줍니다.

 

 A. 조건부 다운 캐스팅

 as? 를 사용합니다.

 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입입니다.

 */


var optionalCasted: Student?


optionalCasted = mike as? UniversityStudent

optionalCasted = jenny as? UniversityStudent // nil

optionalCasted = jina as? UniversityStudent // nil

optionalCasted = jina as? UniversityStudent // nil



/*

 B. 강제 다운 캐스팅

 as! 를 사용합니다.

 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생합니다.

 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환합니다.

 */


var forcedCasted: Student


forcedCasted = mike as! UniversityStudent

//forcedCasted = jenny as! UniversityStudent // 런타임 오류

//forcedCasted = jina as! UniversityStudent // 런타임 오류

//forcedCasted = jina as! UniversityStudent // 런타임 오류


func doSomethingWithSwitch(someone: Person) {

    switch someone {

    case is UniversityStudent:

        (someone as! UniversityStudent).goToMT()

    case is Student:

        (someone as! Student).goToSchool()

    case is Person:

        (someone as! Person).breath()

    }

}


doSomethingWithSwitch(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남!

doSomethingWithSwitch(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남!

doSomethingWithSwitch(someone: jenny) // 등교를 합니다

doSomethingWithSwitch(someone: myName) // 숨을 쉽니다


func doSomething(someone: Person) {

    if let universityStudent = someone as? UniversityStudent {

        universityStudent.goToMT()

    }else if let student = someone as? Student {

        student.goToSchool()

    }else if let person = someone as? Person {

        person.breath()

    }

}


doSomething(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남!

doSomething(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남!

doSomething(someone: jenny) // 등교를 합니다

doSomething(someone: myName) // 숨을 쉽니다








//: Playground - noun: a place where people can play

import Swift



// 예제 클래스

// 사람 클래스

class Person {

    var name: String

    var job: String?

    var home: Apartment?

    

    init(name: String){

        self.name = name

    }

}


// 사람이 사는 집 클래스

class Apartment {

    var buildingNumber: String

    var roomNumber: String

    var `guard`: Person?

    var owner: Person?

    

    init(dong: String, ho:String){

        buildingNumber = dong

        roomNumber = ho

    }

}


// 옵셔널 체이닝 사용

let myName: Person? = Person(name: "myName")

let apart: Apartment? = Apartment(dong:"102", ho:"303")

let superman: Person? = Person(name: "superman")


// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로 결과 타입도 옵셔널입니다.


// 만약 우리집의 경비원의 직업이 궁금하다면?


// 옵셔널 체이닝을 사용하지 않는다면...

func guardjob(owner: Person?){

    if let owner = owner {

        if let home = owner.home {

        if let `guard` = home.guard {

            if let guardJob = `guard`.job{

                print("우리집 경비원의 직업은 \(guardJob)입니다")

            }else {

                print("우리집 경비원은 직업이 없어요")

            }

        }

    }

  }

}

guardjob(owner:myName)


// 옵셔널 체이닝을 사용한다면

func guardJobWithOptionalChaining(owner:Person?){

    if let guardJob = owner?.home?.guard?.job{

        print("우리집 경비원의 직업은 \(guardJob)입니다")

    }else {

        print("우리집 경비원은 직업이 없어요")

    }

}




guardJobWithOptionalChaining(owner: myName)

// 우리집 경비원은 직업이 없어요


myName?.home?.guard?.job // nil


myName?.home = apart


myName?.home //Apratment


myName?.home?.guard //nil


// 경비원 할당


myName?.home?.guard = superman


myName?.home?.guard //Person


myName?.home?.guard?.name //superman


myName?.home?.guard?.job //nil


myName?.home?.guard?.job = "경비원"




/*

- nil 병합 연산자

중위 연산자입니다.??

optional ?? value

옵셔널 값이 nil일 경우, 우측의 값을 반환합니다.

띄어쓰기에 주의하여야 합니다.

 */


var guardJob: String


guardJob = myName?.home?.guard?.job ?? "슈퍼맨"

print(guardJob) // 경비원


myName?.home?.guard?.job = nil


guardJob = myName?.home?.guard?.job ?? "슈퍼맨"

print(guardJob) // 슈퍼맨










//

//  ViewController.swift

//  WeatherTable

//

//  Created by stayfoolish on 2018. 9. 21..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController,UITableViewDataSource {

    

    var datalist:[[String:String]] = [[:]]

    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return datalist.count

    }

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        

        var dicTemp = datalist[indexPath.row]

        

        cell.textLabel?.text = dicTemp["지역"]

        

        let weatherStr = dicTemp["날씨"]

        

        cell.detailTextLabel?.text = weatherStr

        

        if weatherStr == "맑음"{

            cell.imageView?.image = UIImage(named: "sunny.png")

        }else if weatherStr == "비"{

            cell.imageView?.image = UIImage(named: "rainy.png")

        }else if weatherStr == "흐림"{

            cell.imageView?.image = UIImage(named: "cloudy.png")

        }else if weatherStr == "눈"{

            cell.imageView?.image = UIImage(named: "snow.png")

        }else {

            cell.imageView?.image = UIImage(named: "blizzard.png")

        }

        

        return cell

    }

    


    override func viewDidLoad() {

        super.viewDidLoad()

        let dict1 = ["지역":"한국","날씨":"비"]

        let dict2 = ["지역":"일본","날씨":"맑음"]

        let dict3 = ["지역":"중국","날씨":"눈"]

        let dict4 = ["지역":"스페인","날씨":"우박"]

        let dict5 = ["지역":"미국","날씨":"흐림"]

        let dict6 = ["지역":"영국","날씨":"비"]

        let dict7 = ["지역":"프랑스","날씨":"흐림"]

        let dict8 = ["지역":"브라질","날씨":"우박"]

        let dict9 = ["지역":"스위스","날씨":"맑음"]

        let dict10 = ["지역":"덴마크","날씨":"비"]

        let dict11 = ["지역":"스웨덴","날씨":"눈"]

        let dict12 = ["지역":"네덜란드","날씨":"비"]

        let dict13 = ["지역":"크로아티아","날씨":"맑음"]

        let dict14 = ["지역":"필리핀","날씨":"맑음"]

        let dict15 = ["지역":"독일","날씨":"눈"]

        let dict16 = ["지역":"헝가리","날씨":"비"]

        let dict17 = ["지역":"벨기에","날씨":"흐림"]

        let dict18 = ["지역":"핀란드","날씨":"우박"]

        let dict19 = ["지역":"이탈리아","날씨":"맑음"]

        

        datalist = [dict1,dict2,dict3,dict4,dict5,dict6,dict7,dict8,dict9,dict10,dict11,dict12,dict13,dict14,dict15,dict16,dict17,dict18,dict19]

        

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}



















//

//  MainViewController.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 20..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class MainViewController: UIViewController , UITableViewDataSource, UITableViewDelegate {


    @IBOutlet weak var tableView: UITableView!

    

    let sampleData = SampleData()

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.tableView.tableFooterView = UIView(frame: .zero)

        self.tableView.dataSource = self

        self.tableView.delegate = self

    }

    

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        

        self.navigationController?.navigationBar.prefersLargeTitles = true

    }

    

    override func viewWillDisappear(_ animated: Bool) {

        super.viewWillDisappear(animated)

        

        self.navigationController?.navigationBar.prefersLargeTitles = false

    }

    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.sampleData.samples.count

    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "mainFeatureCell", for: indexPath) as! MainFeatureCell

        

        let sample = self.sampleData.samples[indexPath.row]

        

        cell.titleLabel.text = sample.title

        cell.descriptionLabel.text = sample.desription

        cell.featureImageView.image = UIImage(named: sample.image)

        

        return cell

    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        tableView.deselectRow(at: indexPath, animated: true)

        switch indexPath.row {

        case 0: self.performSegue(withIdentifier: "photoObjectDetection", sender: nil)

        case 1: self.performSegue(withIdentifier: "realTimeObjectDetection", sender: nil)

        case 2: self.performSegue(withIdentifier: "facialAnalysis", sender: nil)

        default:

            return

        }

    }



}





custom TableViewCell 커스텀 테이블뷰셀 만들기, 테이블뷰 줄 안보이게 하기 


//

//  MainFeatureCell.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 20..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class MainFeatureCell: UITableViewCell {


    @IBOutlet weak var featureImageView: UIImageView!

    @IBOutlet weak var titleLabel: UILabel!

    @IBOutlet weak var descriptionLabel: UILabel!

    

}


//

//  SampleData.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 20..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import Foundation


struct Sample {

    let title: String

    let desription: String

    let image: String

}


struct SampleData {

    let samples = [

        Sample(title: "Photo Object Detection", desription: "불러온 이미지에 있는 사물 인식", image: "ic_photo"),

        Sample(title: "Real Time Object Detection", desription: "실시간으로 카메라에 보이는 사물 인식", image: "ic_camera"),

        Sample(title: "Facial Analysis", desription: "사람 얼굴로부터 나이, 성별, 감정 추측", image: "ic_emotion")

    ]

}



//

//  MainViewController.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 20..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class MainViewController: UIViewController , UITableViewDataSource {


    @IBOutlet weak var tableView: UITableView!

    

    let sampleData = SampleData()

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.tableView.tableFooterView = UIView(frame: .zero)

        self.tableView.dataSource = self

    }

    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.sampleData.samples.count

    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "mainFeatureCell", for: indexPath) as! MainFeatureCell

        

        let sample = self.sampleData.samples[indexPath.row]

        

        cell.titleLabel.text = sample.title

        cell.descriptionLabel.text = sample.desription

        cell.featureImageView.image = UIImage(named: sample.image)

        

        return cell

    }

    



}




swift tableview 기본 data array 



//

//  MainViewController.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 20..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class MainViewController: UIViewController , UITableViewDataSource {


    @IBOutlet weak var tableView: UITableView!

    

    let dataArray = ["1","2","3","4","5","6","7","8","9","10",]

    

    

    override func viewDidLoad() {

        super.viewDidLoad()


        self.tableView.dataSource = self

    }

    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.dataArray.count

    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "numberCell", for: indexPath)

        

        cell.textLabel?.text = self.dataArray[indexPath.row]

        

        return cell

    }

    



}



modal 방식



navigation controller 추가한 push 방식






//

//  FirstViewController.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 19..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class FirstViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()


        // Do any additional setup after loading the view.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    

    @IBAction func buttonPressed(_ sender: UIButton) {

        self.performSegue(withIdentifier: "goToSecondViewController", sender: nil)

    }

    

    /*

    // MARK: - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // Get the new view controller using segue.destinationViewController.

        // Pass the selected object to the new view controller.

    }

    */


}



//

//  SecondViewController.swift

//  ai 11

//

//  Created by stayfoolish on 2018. 9. 19..

//  Copyright © 2018년 stayfoolish. All rights reserved.

//


import UIKit


class SecondViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()


        // Do any additional setup after loading the view.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    

    @IBAction func goBack(_ sender: UIButton) {

        self.dismiss(animated: true, completion: nil)

    }

    

    /*

    // MARK: - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // Get the new view controller using segue.destinationViewController.

        // Pass the selected object to the new view controller.

    }

    */


}






import Swift


/*

 스위프트의 모든 인스턴스는 초기화와 동시에

 모든 프로퍼티에 유효한 값이 할당외어 있어야 합니다.

 프로퍼티에 미리 기본값을 할당해주면

 인스턴스가 생성됨과 동시에 초기값을 지니게 욉니다.

 */


class PersonA {

    // 모든 저장 프로퍼티에 기본값 할당

    var name: String = "unknown"

    var age: Int = 0

    var nickName: String = "nick"

}


let jason: PersonA = PersonA()

jason.name = "jason"

jason.age = 30

jason.nickName = "j"


/*

 이니셜라이저

 

 프로퍼티 기본값을 지정하기 어려운 경우에는

 이니셜라이저를 통해

 인스턴스가 가져야 할 초기값을 전달할 수 있습니다.

*/


class PersonB {

    var name: String

    var age: Int

    var nickName: String

    

    // 이니셜라이저

    init(name: String, age: Int, nickName: String){

        self.name = name

        self.age = age

        self.nickName = nickName

    }

    

}


let hana : PersonB = PersonB(name: "hana", age: 20, nickName: "하나")

// let hana : PersonB = PersonB(name: "hana", age: 20, nickName: "")


// 프로퍼티의 초기값이 꼭 필요 없을 때 옵셔널을 사용!


class PersonC {

    var name: String

    var age: Int

    var nickName: String?

    

    init(name: String, age: Int, nickName: String){

        // a

        self.name = name

        self.age = age

        self.nickName = nickName

    }

    

    /*

     중복 제거하는 방법

     convenience init(name: String, age: Int , nickName: String) {

        self.init(name: name, age: age)

        self.nickName = nickName

     }

     */

    

    init(name: String, age: Int){

        //a

        self.name = name

        self.age = age

    }

    

}


let jenny: PersonC = PersonC(name: "jenny", age: 10)

let mike: PersonC = PersonC(name: "mike", age: 15, nickName: "m")



/*

 암시적 추출 옵셔널은

 인스턴스 사용에 꼭 필요하지만

 초기값을 할당하지 않고자 할 때 사용

 */


class Puppy {

    var name: String

    var owner: PersonC!

    

    init(name: String){

        self.name = name

    }

    

    func goOut() {

        print("\(name)가 주인 \(owner.name)와 산책을 합니다")

    }

}


let happy: Puppy = Puppy(name: "happy")

// happy.goOut()

happy.owner = jenny

happy.goOut() // happy가 주인 jenny와 산책을 합니다.


/*

 실패가능한 이니셜라이저

 이니셜라이저 매개변수로 전달되는 초기값이 잘못된 경우

 인스턴스 생성에 실패할 수 있습니다.

 인스턴스 생성에 실패하면 nil을 반환합니다.

 그래서 실패가능한 이니셜라이저의 반환타입은 옵셔널 타입입니다.

 */


class PersonD {

    var name: String

    var age: Int

    var nickName: String?

    

    init?(name: String, age: Int) {

        if (0...120).contains(age) == false {

            return nil

        }

        

        if name.characters.count == 0 {

            return nil

        }

        

        self.name = name

        self.age = age

    }

}


// let john: PersonD = PersonD(name: "john", age: 23)

let john: PersonD? = PersonD(name: "john", age: 23)

let joker: PersonD? = PersonD(name: "joker", age: 123)

let batman: PersonD? = PersonD(name: "", age: 10)


print(joker)

print(batman)


/*

 디이니셜라이저

 

 deinit은 클래스의 인스턴스가

 메모리에서 해제되는 시점에 호출됩니다.

 인스턴스가 해제되는 시점에 해야할 일을 구현할 수 있습니다.

*/


class PersonE{

    var name: String

    var pet: Puppy?

    var child: PersonC

    

    init(name: String, child: PersonC){

        self.name = name

        self.child = child

    }

    

    deinit {

        if let petName = pet?.name {

            print("\(name)가 \(child.name)에게 \(petName)를 인도합니다")

            self.pet?.owner = child

        }

    }

}


var donald: PersonE? = PersonE(name: "donald", child: jenny)

donald?.pet = happy

donald = nil // donald 인스턴스가 더이상 필요없으므로 메모리에서 해제됩니다.

// donald가 jenny에게 happy를 인도합니다.



import Swift


/* 상속

 스위프트의 상속은 클래스, 프로토콜 등에서 가능합니다.

 열거형, 구조체는 상속이 불가능합니다.

 스위프트는 다중상속을 지원하지 않습니다.


*/


class Person {

    var name: String = ""

    

    func selfIntroduce() {

        print("저는 \(name)입니다")

    }

    // final 키워드를 사용하여 재정의를 방지할 수 있습니다.

    // 자식 class로 물려줬을 때 덮어쓰지(override) 않게 하기 위한 것입니다.

    final func sayHello(){

        print("hello")

    }

    

    // 타입 메서드

    // 재정의 불가 타입 메서드 - static

    static func typeMethod() {

        print("type method - static")

    }

    

    // 재정의 가능 타입 메서드 - class

    class func classMethod() {

        print("type method - class")

    }

    

    // 재정의 가능한 class 메서드라도 final 키워드를 사용하면 재정의 할 수 없습니다.

    // 메서드 앞의 `static` 과 `final class`는 똑같은 역할을 합니다.

    final class func finalclassMethod() {

        print("type method - final class")

    }

    

}


class Student: Person {

    // var name: String = ""

    var major: String = ""

    

    override func selfIntroduce() {

        print("저는 \(name)이고, 전공은 \(major)입니다.")

    }

    

    override class func classMethod(){

        print("overriden type method - class")

    }

    

    // static을 사용한 타입 메서드는 재정의 할 수 없습니다.

    // override static func typeMethod() {   }

    

    // final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다.

    // override func sayHello() {   }

    // override class func finalClassMethod() {   }

}


let whoami: Person = Person()

let hana: Student = Student()


whoami.name = "realName"

hana.name = "hana"

hana.major = "Swift"


whoami.selfIntroduce() // 저는 realName입니다


hana.selfIntroduce() // 저는 hana이고, 전공은 Swift입니다.



Person.classMethod() // type method - class



Person.typeMethod() // type method - static



Person.finalclassMethod() // type method - final class



Student.classMethod() // overriden type method - class



Student.typeMethod() // type method - static



Student.finalclassMethod() // type method - final class







+ Recent posts