πŸ“± App Development Study/iOS🍎

[Udemy iOS & Swift Bootcamp] extension

ibelieveinme 2023. 5. 14. 00:18
728x90

extension ?

κΈ°μ‘΄ 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 것.

Swiftκ°€ μ˜€ν”ˆμ†ŒμŠ€κ°€ μ•„λ‹ˆλΌμ„œ κΈ°μ‘΄ μ†ŒμŠ€μ½”λ“œμ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λŠ” νƒ€μž…λ“€μ„ ν™•μž₯ν•  수 μžˆλ‹€.

 

 

μ½”λ“œ κΈ°λ³Έν˜•

extension someType{
	//Add new functionality
}

 

μ˜ˆμ‹œ 1)

import UIKit

var myDouble = 3.14519

let myRoundedDouble = String(format: "%.1f", myDouble) // 3.1
myDouble.round() //3
//myDouble.round(to: 3) //???? round에 to값을 λ„£λŠ” ν•¨μˆ˜λŠ” μ—†μœΌλ―€λ‘œ errorλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

3.14519 λΌλŠ” 값을 κ°€μ§„ myDouble λ³€μˆ˜κ°€ μžˆλ‹€.

 

이 κ±Έ String ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ†Œμˆ˜μ  1의 μžλ¦¬κΉŒμ§€λ§Œ 좜λ ₯ν•  수 μžˆλ‹€.

round() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ μ •μˆ˜λ§Œ 좜λ ₯ν•  μˆ˜λ„ μžˆλ‹€.

 

이 λ•Œ, myDouble.round(to:3) μ΄λ ‡κ²Œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ„κΉŒ?

round ν•¨μˆ˜μ—λŠ” to 값을 λ³΄λ‚΄λŠ” ν•¨μˆ˜λŠ” μ—†λ‹€. κ·Έλž˜μ„œ error κ°€ λ‚œλ‹€.

 

ν•˜μ§€λ§Œ extension 으둜 직접 λ§Œλ“ λ‹€λ©΄ myDouble.round(to:3)을 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

import UIKit

extension Double{
    //(μ™ΈλΆ€μΈμž λ‚΄λΆ€μΈμž : νƒ€μž…) -> λ¦¬ν„΄νƒ€μž…
    func round(to places: Int) -> Double
    {
        let precisionNumber = pow(10, Double(places))
        var n = self
        n = n * precisionNumber
        n.round()
        n = n / precisionNumber
        return n
    }
}

var myDouble = 3.14519

myDouble = myDouble * 1000
myDouble.round()
myDouble = myDouble / 1000

myDouble.round(to: 1)

Double extension 에 round(to places: Int) -> Double ν•¨μˆ˜λ₯Ό λ§Œλ“€μ—ˆλ‹€.

이제 myDouble.round(to: 1) μš”λŸ° ν˜•μ‹μ΄ κ°€λŠ₯ν•˜λ‹€.

myDouble.round(to:1) 은 1의 μžλ¦¬μˆ˜κΉŒμ§€ λ°˜ν™˜ν•˜λŠ” 것!

 

μ˜ˆμ‹œ2)

λ²„νŠΌ ν•¨μˆ˜μ—λ„ extension 을 λ§Œλ“€ 수 μžˆλ‹€.

μœ„λŠ” μ½”λ“œλ‘œ UIButton을 λ§Œλ“€κ³  배경색을 μž…ν˜€μ€€ λͺ¨μŠ΅μ΄λ‹€.

κ·Έλƒ₯ λ²„νŠΌ 말고 λ‘₯κ·Ό λ²„νŠΌμ„ λ§Œλ“€κ³  싢은데, 그런 ν•¨μˆ˜λŠ” μ—†λ‹€. 근데 extension 으둜 λ§Œλ“€λ©΄ λœλ‹€.

UIButton extension 을 λ§Œλ“€κ³  κ·Έ μ•ˆμ— makeCircular() ν•¨μˆ˜λ₯Ό μΆ”κ°€ν–ˆλ‹€.

button에 makeCircular() ν•¨μˆ˜κ°€ 생기고 이λ₯Ό ν˜ΈμΆœν•˜λ©΄ μœ„μ™€ 각이 λ‘₯κ·Ό λ²„νŠΌμ΄ λ§Œλ“€μ–΄ μ§„λ‹€.

 

κ·Έ μ™Έ ν”„λ‘œν† μ½œλ„ κ°€λŠ₯ !

 


Clima ν”„λ‘œμ νŠΈμ— 적용

 

//이전 μ½”λ“œ

import UIKit

class WeatherViewController: UIViewController, UITextFieldDelegate, WeatherManagerDelegate {

    @IBOutlet weak var conditionImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var searchTextField: UITextField!
    
    var weatherManager = WeatherManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        weatherManager.delegate = self
        searchTextField.delegate = self
    }

    @IBAction func serarchPressed(_ sender: UIButton) {
        searchTextField.endEditing(true)
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(false)
        print(searchTextField.text!)
        return true
    }
    
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        if textField.text != ""{
            return true
        }
        else {
            textField.placeholder = "Type Something"
            return false
        }
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        if let city = searchTextField.text {
            weatherManager.fetchWeather(cityName: city)
        }
        searchTextField.text = ""
    }
    
    func didUpdateWeather(_ weatherManger: WeatherManager, weather: WeatherModel){
        //DispatchQueue 둜 μ•ˆκΈ°λ‹€λ¦¬λ©΄ μ—λŸ¬ 남.
        DispatchQueue.main.async{
            self.temperatureLabel.text = weather.temperatureName
            self.conditionImageView.image = UIImage(systemName: weather.conditionName)
        }
        print(weather.temperature)
    }
    
    func didFailWithError(error: Error){
        print(error)
    }
}

 

//extension을 μ μš©ν•΄μ„œ μ½”λ“œλ₯Ό λ‹¨μˆœν™” ν•œ 것.

import UIKit

class WeatherViewController: UIViewController {

    @IBOutlet weak var conditionImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var searchTextField: UITextField!
    
    var weatherManager = WeatherManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        weatherManager.delegate = self
        searchTextField.delegate = self
    }
}

extension WeatherViewController: UITextFieldDelegate{
    
    @IBAction func serarchPressed(_ sender: UIButton) {
        searchTextField.endEditing(true)
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(false)
        print(searchTextField.text!)
        return true
    }
    
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        if textField.text != ""{
            return true
        }
        else {
            textField.placeholder = "Type Something"
            return false
        }
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        if let city = searchTextField.text {
            weatherManager.fetchWeather(cityName: city)
        }
        searchTextField.text = ""
    }
}

extension WeatherViewController: WeatherManagerDelegate{
    
    func didUpdateWeather(_ weatherManger: WeatherManager, weather: WeatherModel){
        //DispatchQueue 둜 μ•ˆκΈ°λ‹€λ¦¬λ©΄ μ—λŸ¬ 남.
        DispatchQueue.main.async{
            self.temperatureLabel.text = weather.temperatureName
            self.conditionImageView.image = UIImage(systemName: weather.conditionName)
        }
        print(weather.temperature)
    }
    
    func didFailWithError(error: Error){
        print(error)
    }
}

 

728x90