import Swift



struct Student {

    // 인스턴스 저장 프로퍼티

    var name: String = ""

    var `class`: String = "Swift"

    var koreanAge: Int = 0

    

    // 인스턴스 연산 프로퍼티

    var westernAge: Int {

        get {

            return koreanAge - 1

        }

        set(inputValue){

            koreanAge = inputValue + 1

        }

    }

    

    // 타입 저장 프로퍼티

    static var typeDescription: String = "학생"

    

    // 읽기전용 인스턴스 연산 프로퍼티

    var selfIntroduction: String {

        get {

            return "저는 \(self.class)반 \(name)입니다"

        }

    }

    // 읽기전용 타입 연산 프로퍼티

    // 읽기전용에서는 get을 생략할 수 있습니다.

    static var selfIntroduction: String {

        return  "학생타입입니다"

    }

}

// 타입 연산 프로퍼티 사용

print(Student.selfIntroduction)


// 인스턴스 생성

var senior: Student = Student()

senior.koreanAge = 10


// 인스턴스 저장 프로퍼티 사용

senior.name = "성인"

print(senior.name)


// 인스턴스 연산 프로퍼티 사용

print(senior.selfIntroduction)


print("제 한국나이는 \(senior.koreanAge)살이고, 미국나이는 \(senior.westernAge)살입니다.")


struct Money {

    var currencyRate: Double = 1100

    var dollar: Double = 0

    var won: Double {

        get {

            return dollar * currencyRate

        }

        set {

            dollar = newValue / currencyRate

        }

    }

}


var moneyInMyPocket = Money()


moneyInMyPocket.won = 11000


print(moneyInMyPocket.won)


moneyInMyPocket.dollar = 10


print(moneyInMyPocket.won)  // 11000


var a: Int = 100

var b: Int = 200

var sum: Int {

    return a + b

}


print(sum) // 300


// 프로퍼티 감시자


struct Money2 {

    // 프로퍼티 감시자 사용

    var currencyRate: Double = 1100 {

        willSet(newRate){

            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다.")

        }

        

        didSet(oldRate){

            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다.")

        }

    }

    // 프로퍼티 감시자 사용

    var dollar: Double = 0 {

        // willSet의 암시적 매개변수 이름 newValue

        willSet {

            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")

        }

        

        // didSet의 암시적 매개변수 이름 oldValue

        didSet {

            print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")

        }

    }

    

    // 연산 프로퍼티

    var won: Double {

        get {

            return dollar * currencyRate

        }

        set {

            dollar = newValue / currencyRate

        }

    }

    

}


var moneyInMyPocket2: Money2 = Money2()


moneyInMyPocket2.currencyRate = 1150


moneyInMyPocket2.dollar = 10


print(moneyInMyPocket2.won)


/*

 프로퍼티 감시자의 기능은

 함수, 메서드, 클로저, 타입 등의 외부에 위치한

 지역/전역 변수에도 모두 사용 가능합니다.

 */


var c: Int = 100 {

    willSet {

        print("\(c)에서 \(newValue)로 변경될 예정입니다.")

    }

    didSet {

        print("\(oldValue)에서 \(c)로 변경되었습니다")

    }

}


c = 200



import Swift


// 코드의 블럭

// 일급 시민

// 변수, 상수 등으로 저장, 전달인자로 전달이 가능

// 함수 : 이름이 있는 클로저



//{(매개변수 목록) -> 반환타입 in

//   실행 코드

//}



// 함수 사용

func sumFunction(a: Int, b: Int) -> Int {

    return a + b

}


var sumResult: Int = sumFunction(a: 1, b: 2)

print(sumResult) // 3


// 클로저 사용

var sum: (Int, Int) -> Int = { (a: Int, b: Int) in

    return a + b

}


sumResult = sum(1, 2)

print(sumResult) // 3


// 함수는 클로저의 일종이므로

// sum 변수에는 당연히 함수도 할당할 수 있습니다.

sum = sumFunction(a:b:)


sumResult = sum(1, 2)

print(sumResult) // 3


// 함수의 전달인자로서의 클로저

let add: (Int, Int) -> Int

add = { (a: Int, b: Int) in

    return a + b

}


let substract: (Int, Int) -> Int

substract = { (a: Int, b: Int) -> Int in

    return a - b

}


let divide: (Int, Int) -> Int

divide = {(a: Int, b:Int ) -> Int in

    return a / b

}


func calculate(a: Int, b: Int, method: (Int, Int) -> Int ) -> Int {

    return method(a, b)

}


var calculated: Int


calculated = calculate(a: 50, b: 10, method: add)

print(calculated) // 60


calculated = calculate(a: 50, b:10 , method: substract)

print(calculated) // 40


calculated = calculate(a: 50, b:10 , method: divide)

print(calculated) // 5


calculated = calculate(a: 50, b: 10, method: {(left: Int, right: Int) -> Int in

    return left * right

})

print (calculated) // 500


// 클로저 고급


/*

 후행 클로저

 반환타입 생략

 단축 인자이름

 암시적 반환 표현

*/


func calculate2(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {

    return method(a, b)

}


var result: IntegerLiteralType


/*

 후행 클로저

 클로저가 함수의 마지막 전달인자라면

 마지막 매개변수 이름을 생략한 후

 함수 소괄호 외부에 클로저를 구현할 수 있습니다.

*/


result = calculate2(a: 10, b: 10) { (left: Int, right: Int) -> Int in

    return left + right

}


print(result) // 20


/*

 반환타입 생략

 calculate 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에

 굳이 클로저에서 반환타입을 명시해 주지 않아도 됩니다.

 대신 in 키워드는 생략할 수 없습니다.

*/


result = calculate2(a: 10, b:10, method: {(left: Int, right: Int) in

    return left + right

})


print(result) // 20


// 후행클로저와 함께 사용할 수도 있습니다.

result = calculate2(a: 10, b: 10) {(left: Int, right: Int) in

    return left + right

}


/*

 단축 인자이름

 클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있습니다.

 단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1 ... 처럼 표현합니다.

 */


result = calculate2(a: 10, b: 10, method: {

   return $0 + $1

})


print(result) // 20


// 당연히 후행 클로저와 함께 사용할 수 있습니다.

result = calculate2(a: 10, b: 10){

    return $0 + $1

}


print(result) // 20


// 간결하게 한 줄로 표현해 줄 수도 있습니다.

result = calculate2(a: 10, b: 10) { $0 + $1}

print(result) // 20


// 축약하지 않는 클로저 문법과 축약 후의 문법 비교


result = calculate2(a: 10, b: 10, method: {(left: Int, right: Int) -> Int in

    return left + right

})


result = calculate2(a: 10, b: 10) { $0 + $1 }

print(result) // 20


















import Swift


//class:

// 단일상속

// 참조타입

// apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성

//

//struct:

// 상속불가

// 값타입

// swift의 대부분의 큰 뼈대는 모두 구조체로 구성

//

//Enum:

// 상속불가

// 값타입

// 열거형 자체가 하나의 데이터 타입

// 열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급

//

//struct(구조체) 언제 사용?

// 참조가 아닌 복사를 원할 때, 상속받을 필요가 없을 때

//

//Value vs Reference

// Value : 데이터를 전달할 때 값을 복사하여 전달

// Reference : 데이터를 전달할 때 값의 메모리 위치를 전달


struct ValueType {

    var property = 1

}


class ReferenceType {

    var property = 1

}


let firstStructInstance = ValueType()

var secondStructInstance = firstStructInstance

secondStructInstance.property = 2


print("first struct instance property : \(firstStructInstance.property)") // first struct instance property : 1

print("second struct instance property : \(secondStructInstance.property)") // second struct instance property : 2


let firstClassReference = ReferenceType()

var secondClassReference = firstClassReference

secondClassReference.property = 2


print ("first class reference property : \(firstClassReference.property)") // first class reference property : 2

print ("second class reference property : \(secondClassReference.property)") // second class reference property : 2


struct SomeStruct {

    var someProperty: String = "Property"

}


var someStructInstance: SomeStruct = SomeStruct()


func someFunction(structInstance: SomeStruct) {

    var localVar: SomeStruct = structInstance

    localVar.someProperty = "ABC"

}


// 복사되서 들어가기 때문에 property 그대로 값이 유지된다.

someFunction(structInstance: someStructInstance)

print(someStructInstance.someProperty) // Property



class SomeClass {

    var someProperty: String = "Property"

}


var someClassInstance: SomeClass = SomeClass()


func someFunction(classInstance: SomeClass) {

    var localVar: SomeClass = classInstance

    localVar.someProperty = "ABC"

}


// 참조값이 전달되기 때문에 ABC 값으로 변경된다.

someFunction(classInstance: someClassInstance)

print(someClassInstance.someProperty) // ABC


// 스위프트는 구조체, 열거형 사용을 선호

// Apple 프레임워크는 대부분 class 사용

// Apple 프레임워크 사용시 struct/class 선택은 우리의 몫















//

//  ViewController.swift

//  ImagePicker

//

//  Created by stayfoolish on 2018. 8. 28..

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

//


import UIKit


class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{


    lazy var imagePicker: UIImagePickerController = {

        let picker: UIImagePickerController = UIImagePickerController()

        picker.sourceType = .photoLibrary

        picker.delegate = self

        return picker

    }()

    

    @IBOutlet weak var imageView: UIImageView!

    

    @IBAction func touchUpSelectImageButton(_ sender: UIButton){

        self.present(self.imagePicker, animated: true, completion: nil)

    }

    

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

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

    }

    

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        

        if let originalImage: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

            self.imageView.image = originalImage

        }

        

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

    }

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // 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.

    }



}













//

//  ViewController.swift

//  MusicPlayer

//

//  Created by stayfoolish on 2018. 8. 27..

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

//


import UIKit

import AVFoundation


class ViewController: UIViewController, AVAudioPlayerDelegate {


    var player: AVAudioPlayer!

    var timer: Timer!

    

    @IBOutlet var playPauseButton: UIButton!

    @IBOutlet var timeLabel: UILabel!

    @IBOutlet var progressSlider: UISlider!

    

    

    func initializePlayer() {

        

        guard let soundAsset: NSDataAsset = NSDataAsset(name: "sound") else {

            print("음원 파일 에셋을 가져올 수 없습니다")

            return

        }

        

        do {

            try self.player = AVAudioPlayer(data: soundAsset.data)

            self.player.delegate = self

        } catch let error as NSError {

            print("플레이어 초기화 실패")

            print("코드 : \(error.code), 메세지 : \(error.localizedDescription)")

        }

        

        self.progressSlider.maximumValue = Float(self.player.duration)

        self.progressSlider.minimumValue = 0

        self.progressSlider.value = Float(self.player.currentTime)

    }

    

    func updateTimeLabelText(time: TimeInterval) {

        let minute: Int = Int(time / 60)

        let second: Int = Int(time.truncatingRemainder(dividingBy: 60))

        let milisecond: Int = Int(time.truncatingRemainder(dividingBy: 1) * 100)

        

        let timeText: String = String(format: "%02ld:%02ld:%02ld", minute, second, milisecond)

        

        self.timeLabel.text = timeText

    }

    

    func makeAndFireTimer() {

        self.timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { [unowned self] (timer: Timer) in

            

            if self.progressSlider.isTracking { return }

            

            self.updateTimeLabelText(time: self.player.currentTime)

            self.progressSlider.value = Float(self.player.currentTime)

        })

        self.timer.fire()

    }

    

    func invalidateTimer() {

        self.timer.invalidate()

        self.timer = nil

    }

    

    func addViewsWithCode() {

        self.addPlayPauseButton()

        self.addTimeLabel()

        self.addProgressSlider()

    }

    

    func addPlayPauseButton() {

        

        let button: UIButton = UIButton(type: UIButtonType.custom)

        button.translatesAutoresizingMaskIntoConstraints = false

        

        self.view.addSubview(button)

        

        button.setImage(UIImage(named: "button_play"), for: UIControlState.normal)

        button.setImage(UIImage(named: "button_pause"), for: UIControlState.selected)

        

        button.addTarget(self, action: #selector(self.touchUpPlayPauseButton(_:)), for: UIControlEvents.touchUpInside)

        

        let centerX: NSLayoutConstraint

        centerX = button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)

        

        let centerY: NSLayoutConstraint

        centerY = NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerY, multiplier: 0.8, constant: 0)

        

        let width: NSLayoutConstraint

        width = button.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.5)

        

        let ratio: NSLayoutConstraint

        ratio = button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1)

        

        centerX.isActive = true

        centerY.isActive = true

        width.isActive = true

        ratio.isActive = true

        

        self.playPauseButton = button

    }

    

    func addTimeLabel() {

        let timeLabel: UILabel = UILabel()

        timeLabel.translatesAutoresizingMaskIntoConstraints = false

        

        self.view.addSubview(timeLabel)

        

        timeLabel.textColor = UIColor.black

        timeLabel.textAlignment = NSTextAlignment.center

        timeLabel.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)

        

        let centerX: NSLayoutConstraint

        centerX = timeLabel.centerXAnchor.constraint(equalTo: self.playPauseButton.centerXAnchor)

        

        let top: NSLayoutConstraint

        top = timeLabel.topAnchor.constraint(equalTo: self.playPauseButton.bottomAnchor, constant: 8)

        

        centerX.isActive = true

        top.isActive = true

        

        self.timeLabel = timeLabel

        self.updateTimeLabelText(time: 0)

    }

    

    func addProgressSlider() {

        let slider: UISlider = UISlider()

        slider.translatesAutoresizingMaskIntoConstraints = false

        

        self.view.addSubview(slider)

        

        slider.minimumTrackTintColor = UIColor.red

        

        slider.addTarget(self, action: #selector(self.sliderValueChanged(_:)), for: UIControlEvents.valueChanged)

        

        let safeAreaGuide: UILayoutGuide = self.view.safeAreaLayoutGuide

        

        let centerX: NSLayoutConstraint

        centerX = slider.centerXAnchor.constraint(equalTo: self.timeLabel.centerXAnchor)

        

        let top: NSLayoutConstraint

        top = slider.topAnchor.constraint(equalTo: self.timeLabel.bottomAnchor, constant: 8)

        

        let leading: NSLayoutConstraint

        leading = slider.leadingAnchor.constraint(equalTo: safeAreaGuide.leadingAnchor, constant: 16)

        

        let trailing: NSLayoutConstraint

        trailing = slider.trailingAnchor.constraint(equalTo: safeAreaGuide.trailingAnchor, constant: -16)

        

        centerX.isActive = true

        top.isActive = true

        leading.isActive = true

        trailing.isActive = true

        

        self.progressSlider = slider

    }

    

    override func viewDidLoad() {

        super.viewDidLoad()

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

        self.initializePlayer()

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    

    func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {

        

        guard let error: Error = error else {

            print("오디오 플레이어 디코드 오류발생")

            return

        }

        

        let message: String

        message = "오디오 플레이어 오류 발생 \(error.localizedDescription)"

        

        let alert: UIAlertController = UIAlertController(title: "알림", message: message, preferredStyle: UIAlertControllerStyle.alert)

        

        let okAction: UIAlertAction = UIAlertAction(title: "확인", style: UIAlertActionStyle.default) { (action: UIAlertAction) -> Void in

            

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

        }

        

        alert.addAction(okAction)

        self.present(alert, animated: true, completion: nil)

    }

    

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {

        self.playPauseButton.isSelected = false

        self.progressSlider.value = 0

        self.updateTimeLabelText(time: 0)

        self.invalidateTimer()

    }

    

    

    @IBAction func touchUpPlayPauseButton(_ sender: UIButton){

        

        sender.isSelected = !sender.isSelected

        

        if sender.isSelected{

            self.player?.play()

        } else {

            self.player?.pause()

        }

        

        if sender.isSelected {

            self.makeAndFireTimer()

        }else {

            self.invalidateTimer()

        }

        

    }


    @IBAction func sliderValueChanged(_ sender: UISlider) {

        self.updateTimeLabelText(time: TimeInterval(sender.value))

        if sender.isTracking { return }

        self.player.currentTime = TimeInterval(sender.value)

    }

    

    

}











//

//  ViewController.swift

//  PickerView

//

//  Created by stayfoolish on 2018. 8. 24..

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

//


import UIKit


class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {


    let MAX_ARRAY_NUM = 12

    let PICKER_VIEW_COLUMN = 1

    var imageArray = [UIImage?]()

    var imageFileName = ["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg","9.jpg","10.jpg","11.jpg","12.jpg",]

    @IBOutlet var pickerImage: UIPickerView!

    @IBOutlet var lblImageFileNmae: UILabel!

    @IBOutlet var imageView: UIImageView!

    

    override func viewDidLoad() {

        super.viewDidLoad()

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

        for i in 0 ..< MAX_ARRAY_NUM{

            let image = UIImage(named: imageFileName[i])

            imageArray.append(image)

        }

        

        lblImageFileNmae.text = imageFileName[0]

        imageView.image = imageArray[0]

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    func numberOfComponents(in pickerView: UIPickerView) -> Int {

        return PICKER_VIEW_COLUMN

    }

    

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        return imageFileName.count

    }

    

/*

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int , forComponent component: Int ) -> String?{

        return imageFileName[row]

    }

*/


    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component:Int,

                    reusing view: UIView?) -> UIView {

        let imageView = UIImageView(image:imageArray[row])

        imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 150)

        

        return imageView

    }

 

    

 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int ){

        lblImageFileNmae.text = imageFileName[row]

        imageView.image = imageArray[row]

    }


}






//

//  ViewController.swift

//  DatePicker

//

//  Created by stayfoolish on 2018. 8. 22..

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

//


import UIKit


class ViewController: UIViewController {

    

    let timeSelector: Selector = #selector(ViewController.updateTime)

    let interval = 1.0

    var count = 0

    

    


    @IBOutlet var lblCurrentTime: UILabel!

    @IBOutlet var lblPickerTime: UILabel!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

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

        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector,

                             userInfo: nil, repeats: true)

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    @IBAction func changeDatePicker(_ sender: UIDatePicker) {

        

        let datePickerView = sender

        let formatter = DateFormatter()

        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss EEE"

        lblPickerTime.text = "선택시간: " + formatter.string(from: datePickerView.date)

    }

    

    @objc func updateTime() {

//        lblCurrentTime.text = String(count)

//        count = count + 1

        let date = NSDate()

        

        let formatter = DateFormatter()

        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss EEE"

        lblCurrentTime.text = "현재시간: " + formatter.string(from: date as Date)

    }

    

}





//

//  ViewController.swift

//  ImageView

//

//  Created by stayfoolish on 2018. 8. 22..

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

//


import UIKit


class ViewController: UIViewController {

    

    var isZoom = false

    var imgOn: UIImage?

    var imgOff: UIImage?

    

    

    @IBOutlet var imgView: UIImageView!

    @IBOutlet var btnResize: UIButton!

    

    override func viewDidLoad() {

        super.viewDidLoad()

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

        

        imgOn = UIImage(named: "23efa0b90b7c7935d4e63e88ce863c25.jpg")

        imgOff = UIImage(named: "slack1.jpeg" )

        

        imgView.image = imgOn

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    @IBAction func btnResizeImage(_ sender: UIButton) {

        let scale:CGFloat = 2.0

        var newWidth:CGFloat, newHeight:CGFloat

        

        if (isZoom){ // true

            newWidth = imgView.frame.width/scale

            newHeight = imgView.frame.height/scale

            imgView.frame.size = CGSize(width: newWidth, height: newHeight)

            btnResize.setTitle("확대", for: .normal)

            

        }else {

            newWidth = imgView.frame.width*scale

            newHeight = imgView.frame.height*scale

            imgView.frame.size = CGSize(width: newWidth, height: newHeight)

            btnResize.setTitle("축소", for: .normal)

        }

        isZoom = !isZoom

    }

    

    @IBAction func switchImageOnOff(_ sender: UISwitch) {

        if sender.isOn{

            imgView.image = imgOn

        }else {

            imgView.image = imgOff

        }

    }

}



// 열거형 enum

// 다른 언어에 비해 swift 는 많은 기능을 가지고 있다.


import Swift


// enum은 타입이므로 대문자 카멜케이스를 사용하여 이름을 정의합니다.

// 각 case는 소문자 카멜케이스로 정의합니다.

// 각 case는 그 자체가 고유의 값입니다.


enum Weekday {

    case mon

    case tue

    case wed

    case thu, fri, sat, sun

}


var day: Weekday = Weekday.mon

day = .tue


print(day)


// 하나라도 값이 들어가지 않으면 default를 명시해야한다.

switch day{

case .mon, .tue, .wed, .thu:

    print("평일입니다")

case Weekday.fri:

    print("불금 파티!!")

case .sat, .sun:

    print("신나는 주말!!")

}


// C 언어의 enum처럼 정수값을 가질 수도 있습니다.

// rawValue를 사용하면 됩니다.

// case별로 각각 다른 값을 가져야합니다.



// C 언어처럼 자동으로 1씩 증가한다.

enum Fruit: Int {

    case apple = 0

    case grape = 1

    case peach

// case mango = 0

}


print("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")

// Fruit.peach.rawValue == 2


// 정수 타입 뿐만 아니라 Hashable 프로토콜을 따르는 모든 타입이 원시값의 타입으로 지정될 수 있습니다.


enum School: String {

    case elementary = "초등"

    case middle = "중등"

    case high = "고등"

    case university

}


print("School.middle.rawValue == \(School.middle.rawValue)")

// school.middle.rawValue == 중등


print("School.university.rawValue == \(School.university.rawValue)")

// school.middle.rawValue == university



// 원시값을 통한 초기화


// rawValue를 통해 초기화 할 수 있습니다.

// rawValue가 case에 해당하지 않을 수 있으므로

// rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입입니다.


// let apple: Fruit = Fruit(rawValue: 0)

let apple: Fruit? = Fruit(rawValue: 0)


if let orange: Fruit = Fruit(rawValue: 5) {

    print("rawValue 5에 해당하는 케이스는 \(orange)입니다")

}else {

    print("rawValue 5에 해당하는 케이스가 없습니다.")

} // rawValue 5에 해당하는 케이스가 없습니다.


// 메서드

enum Month {

    case dec, jan, feb

    case mar, apr, may

    case jun, jul, aug

    case sep, oct, nov

    

    func printMessage(){

        switch self {

        case .mar, .apr, .may:

            print("봄")

        case .jun, .jul, .aug:

            print("여름")

        case .sep, .oct, .nov:

            print("가을")

        case .dec, .jan, .feb:

            print("겨울")

        }

    }

}


Month.nov.printMessage()  // 가을


import Swift


// 클래스는 구조체와 유사하다.

// 구조체는 값 타입,  클래스는 참조 타입


class Sample {

    var mutableProperty: Int = 100 // 가변 프로퍼티

    let immutableProperty: Int = 100 // 불변 프로퍼티

    

    static var typeProperty: Int = 100 // 타입 프로퍼티

    

    // 인스턴스 메서드

    func instanceMethod() {

        print("instance method")

    }

    

    // 타입 메서드

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

    static func typeMethod() {

        print("type method - static")

    }

    

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

    class func classMethod() {

        print("type method - class")

    }

}


var mutableReference: Sample = Sample()


mutableReference.mutableProperty = 200

// mutableReference.immutableProperty = 200


let immutableReference: Sample = Sample()


immutableReference.mutableProperty = 200

// immutableReference = mutableReference


// 타입 프로퍼티 및 메서드


Sample.typeProperty = 300

Sample.typeMethod() // type method


//mutableReference.typeProperty = 400

//mutableReference.typeMethod()


class Student {

    var name: String = "unknown"

    var `class`: String = "Swift"

    

    class func selfIntroduce() {

        print("학생타입입니다")

    }

    

    func selfIntroduce() {

        print ("저는 \(self.class)반 \(name)입니다")

    }

}


Student.selfIntroduce() // 학생타입입니다.


var whoamI: Student = Student()

whoamI.name = "whoami"

whoamI.class = "swift"

whoamI.selfIntroduce() // 저는 swift반 whoami입니다


// let 으로 설정해도 변경 가능하다.

let whoareYou: Student = Student()

whoareYou.name = "whoareyou"

whoareYou.selfIntroduce() // 저는 Swift반 whoareyou입니다






+ Recent posts