[SWIFT] Erstellen Sie eine App, die mithilfe der Wetter-API ermittelt, ob Sie einen Regenschirm benötigen.

Einführung

Anfänger haben ein Portfolio für Lernen und Portfolio erstellt. Es ist ungefähr 1 bis 2 Monate her, seit ich angefangen habe, es zu erstellen, daher möchte ich Ratschläge zum Refactoring und Codieren.

App Übersicht

Wenn Sie ein Angestellter sind, dachte ich, es wäre praktisch, wenn es eine App gäbe, die sofort überprüfen könnte, ob Sie heute einen Regenschirm benötigen.

Ich drücke den Knopf ↓ Bestimmen Sie den Breiten- und Längengrad Ihres aktuellen Standorts über GPS ↓ Umgekehrte Geokodierung von Breiten- / Längengrad ↓ Bestimmen Sie die Präfektur, in der Sie sich befinden ↓ Bestimmen Sie die Niederschlagswahrscheinlichkeit in der Präfektur, in der Sie sich befinden, über die Wetter-API ↓ Zeigen Sie, ob Sie einen Regenschirm brauchen oder nicht

Eine solche App war bereits veröffentlicht worden, aber sie war nicht die, die ich wollte, also habe ich auch versucht, ein Portfolio zu erstellen.

Betriebsumgebung

Ziel Ausführung
iOS 14.0
macOS Catalina 10.15.7
Xcode 12.0
Swift 5.3

Wetter-API verwendet OpenWeatherMap

Pod installieren

Diesmal Ich habe "Alaomofire" und "SwiftyJSON" installiert.

Podfile


pod "Alamofire"
pod "SwiftyJSON"

Referenzseite

Erstellen Sie Main.storyboad

Main.storyboad スクリーンショット 2020-10-20 21.01.42.png

Diesmal habe ich HomeVC und UmbrellaVC erstellt. Nach dem Start der App zu Home VC wechseln → Tippen Sie auf die Schaltfläche "Standortinformationen" → Zu Umbrella VC wechseln ① Rufen Sie für die Beschriftung die Präfektur Ihres aktuellen Standorts an, die Sie durch umgekehrte Geokodierung erhalten haben. ② Rufen Sie für die Beschriftung die Niederschlagswahrscheinlichkeit Ihres aktuellen Standorts über die Wetter-API auf. ③ Beurteilen Sie anhand des Niederschlags anhand des Niederschlags, ob ein Regenschirm erforderlich ist oder nicht

Implementieren

Erstellen Sie zunächst ein Modell der Daten, die von der Wetter-API erfasst werden sollen.

CityModel

CityModel.swift


import Foundation

struct cityModel:Decodable{
    
    var list: [List]

    struct List:Decodable {
        var pop:Double
    }
    
}

Ich denke, die hier beschriebene Struktur hängt von den zu erfassenden API-Daten ab. In der diesmal verwendeten Wetter-API "Open Weather" wurde die obige Erfassung erhalten.

Von OpenWeather
erfasste JSON-Daten

Der numerische Wert des Elements "pop" ist der numerische Wert, der dieses Mal erfasst werden soll (Doppeltyp). スクリーンショット 2020-10-20 21.14.22.png

Referenzseite


UmbrellaVC

UmbrellaVC.swift



import UIKit
import CoreLocation

class UmbrellaVC: UIViewController {
    
    @IBOutlet weak var label1: UILabel!
    var locationText:String = "Präfektur Osaka"
    
    @IBOutlet weak var label2: UILabel!
    var popText:Int = 0
    
    @IBOutlet weak var label3: UILabel!
    var umbrellaJudgement:String = "Ich brauche einen Regenschirm"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        label1.text = locationText
        label2.text = "\(popText)" + "%"
        label3.text = umbrellaJudgement
        
        self.label3.layer.borderWidth = 2.0
        self.label3.layer.borderColor = UIColor.black.cgColor
        self.label3.layer.cornerRadius = 20

        //Ändern Sie die Farbe der angezeigten Buchstaben entsprechend der Niederschlagswahrscheinlichkeit, damit Sie auf einen Blick sehen können
        if popText >= 30{
            label3.textColor = .orange
            
        }else if popText >= 70{
            label3.textColor = .red
        }
    }
}

Weisen Sie jedem Label eine Variable zu.

Weisen Sie die von UmbrellaVC festgelegte Variable zu.

HomeVC

HomeVC.swift


import UIKit
import CoreLocation
import Alamofire
import SwiftyJSON

class HomeVC: UIViewController,CLLocationManagerDelegate {
    
    //Geben Sie den Anfangswert in jede Variable ein
    var latitudeNow: Double = 39.0000
    var longitudeNow: Double = 140.0000
    var locationManager: CLLocationManager!
    var administrativeArea:String = ""
    var locationNow: String = ""
    private var citymodel: cityModel?
    var doubleOfMaximumPop:Double = 100.0
    var maxPop:Int = 30
    var Judge:String = ""

 override func viewDidLoad() {
        super.viewDidLoad()

        //Einstellungen für das Layout der Bildansicht
        umbrellaImage.image = UIImage(named:"umbrellaImage")
        umbrellaImage.layer.cornerRadius = 10
                
        //Rufen Sie locationManager während viewDidload auf (Standortinformationen aktualisieren).
        locationManagerDidChangeAuthorization(CLLocationManager())
        
        //Rufen Sie die Wettererfassungsfunktion auf
        getWeatherData()

    }

    //Erhalten Sie Standortinformationen, wenn Sie eine Taste drücken
    @IBAction func buttonTapped(_ sender: Any) {
        
        //Drücken Sie die Taste, um die Aktualisierung von locationManager zu beenden
        stopLocationManager()
        
   }

    //Drücken Sie die Taste, um zur Präfektur in Label 1 in Umbrella VC zu wechseln
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "toUmbrellaVC") {
            let  locationNow: UmbrellaVC = (segue.destination as? UmbrellaVC)!
            locationNow.locationText = administrativeArea
            
            let popNow:UmbrellaVC = (segue.destination as? UmbrellaVC)!
            popNow.popText = Int(maxPop)
            
            let umbJud:UmbrellaVC = (segue.destination as? UmbrellaVC)!
            umbJud.umbrellaJudgement = Judge
            
        }
    }

    //Standortmanager @ iOS 14 Standortinformationen aktualisieren
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        locationManager = CLLocationManager()
        
        let status = manager.authorizationStatus
        
        switch status {
        case .authorizedAlways, .authorizedWhenInUse:
            locationManager.delegate = self
            locationManager.startUpdatingLocation()
            
        case .notDetermined, .denied, .restricted:
            showAlert()
            
        default:print("Unbehandelt")
        }
    }

    //Beenden Sie die Aktualisierung der locationManager-Informationen
        func stopLocationManager(){
            locationManager.stopUpdatingLocation()
        }

    //Funktion zum Anzeigen von Warnungen
    func showAlert(){
        let alertTitle = "Die Erfassung von Standortinformationen ist nicht gestattet."
        let alertMessage = ""Datenschutz" der Einstellungs-App>Bitte wechseln Sie von "Ortungsservice"."
        let alert: UIAlertController = UIAlertController(
            title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert
        )
        //OK-Taste
        let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)
        
        //Aktion zu UIAlertController hinzugefügt
        alert.addAction(defaultAction)
        present(alert, animated: true, completion: nil)
        
    }

    //Eine Funktion, die Standortinformationen speichert, wenn diese aktualisiert werden
    //Der Standortmanager wird erst gestartet, wenn die Standortinformationen aktualisiert wurden. * Wichtig
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
        
        let location = locations.first
        let latitude = location!.coordinate.latitude
        let longitude = location!.coordinate.longitude
        //Standortinformationen speichern
        self.latitudeNow = Double(latitude)
        self.longitudeNow = Double(longitude)
        
        //Nach dem Erfassen der Standortinformationen wird eine umgekehrte Geokodierung durchgeführt, um die Präfektur zu bestimmen.
        let locationA = CLLocation(latitude: latitudeNow, longitude: longitudeNow)
        
        let geocoder: CLGeocoder = CLGeocoder()
        geocoder.reverseGeocodeLocation(locationA) { [self](placemarks, error) in
            if let placemark = placemarks?.first {
                self.administrativeArea = placemark.administrativeArea!

            } else {
                self.administrativeArea = "bb"
            }
        }
    }

    //Ermitteln Sie die maximale Niederschlagswahrscheinlichkeit bis zu 18 Stunden später mithilfe der Wettervorhersage-API
    //In OpenWeatherMap wird eine Gebühr für die Erfassung der täglichen Niederschlagswahrscheinlichkeit erhoben, und die Erfassung der Niederschlagswahrscheinlichkeit alle 3 Stunden ist kostenlos. Verwenden Sie diese Gebühr.(Da es gesehen werden sollte, bevor es morgens zur Arbeit ging, wurde festgestellt, dass es kein Problem gab)
    private func getWeatherData()  {

        let id = "Geben Sie die API-ID ein"
        let baseUrl = "http://api.openweathermap.org/data/2.5/forecast?lat=" + "\(latitudeNow)" + "&lon=" + "\(longitudeNow)" + "&exclude=daily&lang=ja&cnt=6&.pop&appid=" + "\(id)"
        
        AF.request(baseUrl, method: .get).responseJSON { [self] response in
            guard let data = response.data else {
                return
            }
            do {
                let citymodel = try JSONDecoder().decode(cityModel.self, from: data)
                
                //API-Daten auflisten
                let popNumber = citymodel.list.map{ $0.pop }
            
                //Holen Sie sich maximale Daten in der Liste
                var doubleOfMaximumPop = popNumber.max()
                
                //In prozentuale Anzeige der maximalen Daten konvertieren
                let maxPop = doubleOfMaximumPop! * 100
                
                //Stellen Sie fest, ob Daten vorhanden sind
                if doubleOfMaximumPop == nil{
                    print(Error.self)
                }else {
                    //Wenn Sie die Daten haben
                    if doubleOfMaximumPop != nil{
                        //Holen Sie sich maximale Daten
                        doubleOfMaximumPop = self.doubleOfMaximumPop
                    }else {
                        //Wenn die Zahlen gleich sind, wählen Sie eine davon aus
                        doubleOfMaximumPop = popNumber[0]
                    }
                }

                //Weisen Sie der Variablen den von der Funktion getweather erhaltenen numerischen Wert maxPop zu
                self.maxPop = Int(maxPop)
                
                //Beurteilen Sie, ob maxPop einen Regenschirm benötigt, und ersetzen Sie den Richter durch das Urteil.
                if self.maxPop <= 30 {
                    self.Judge = "⛅️ Kein Regenschirm erforderlich ⛅️"
                }else if self.maxPop >= 70 {
                    self.Judge = "☔️ Ich brauche einen Regenschirm ☔️"
                }else {
                    self.Judge = "☂️ Seelenfrieden, wenn Sie einen Klappschirm haben ☂️"
                }
                
            }catch let error {
                print("Error:\(error)")
            }
        }
    }
}

Es ist nicht lesbar, da fast unbekannt ist, was der Variablenname darstellt. Variablenname ist schwierig ...

Schwierigkeiten

  • Da ich den Ablauf der Aktualisierung von Standortinformationen mit LocationManager → umgekehrte Geokodierung zum Erfassen von Daten nicht verstanden habe, sind Probleme wie das Erfassen von Daten, die jedoch nicht Variablen zugewiesen wurden, aufgetreten.

Liste der Referenzseiten

Änderungen des Kernstandorts in iOS 14 Variablen innerhalb der Funktion Variablen außerhalb der Funktion zuweisen [Anmerkungen zu Codale] (https://qiita.com/s_emoto/items/deda5abcb0adc2217e86)

Eingabe
---
** Lesen **
・ Einführung in die Entwicklung von iPhone-Anwendungen "super", die niemals frustriert wird ・ Intensivkurs für die Entwicklung von IPhone-Anwendungen, der in nur 2 Tagen gemeistert werden kann ~~ (Sie können ihn auf keinen Fall in 2 Tagen beherrschen) ~~
**Udemy**
・ IOS12: Lernen Sie, echte iOS 12-Apps in Swift 4.2 zu codieren und zu erstellen Auf Englisch war es ziemlich schwierig, aber es war leicht zu verstehen, weil er mir das Konzept usw. mit Bilddiagrammen beigebracht hat. iOS wird von Zeit zu Zeit aktualisiert, daher dachte ich, ich müsste mit neuen Erkenntnissen Schritt halten.
** Ausgabe **
--- **Qiita**

Viele Leute haben den Quellcode auf Qiita gepostet, so dass ich ihn bisher erstellen konnte. Ich habe es mit der Hoffnung geschaffen, dass es für Menschen unter ähnlichen Umständen nützlich sein würde.

Recommended Posts