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.
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.
Ziel | Ausführung |
---|---|
iOS | 14.0 |
macOS | Catalina 10.15.7 |
Xcode | 12.0 |
Swift | 5.3 |
Wetter-API verwendet OpenWeatherMap
Diesmal Ich habe "Alaomofire" und "SwiftyJSON" installiert.
Podfile
pod "Alamofire"
pod "SwiftyJSON"
Main.storyboad
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
Erstellen Sie zunächst ein Modell der Daten, die von der Wetter-API erfasst werden sollen.
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.
Der numerische Wert des Elements "pop" ist der numerische Wert, der dieses Mal erfasst werden soll (Doppeltyp).
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 die von UmbrellaVC festgelegte Variable zu.
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 ...
Ä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)
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