[Udemy iOS & Swift Bootcamp] extension
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)
}
}