首页 > 其他分享 >使用Xcode制作天气APP

使用Xcode制作天气APP

时间:2024-09-26 18:25:51浏览次数:9  
标签:wea String APP public self let var 制作 Xcode

注:请自行封装API数据请求接口

下载开发工具Xcode

使用Xcode制作天气APP_HTTP

新建项目

使用Xcode制作天气APP_IOS_02

输入自己的项目名称等信息,这里使用的是Storyboard界面

使用Xcode制作天气APP_HTTP_03

创建HttpSender类,新建Swift文件。本次提供POST请求。


import Foundation
 
class HttpSender {
    //JSON 解析器
    private static let decoder = JSONDecoder()
    
    //http-post请求
    /**
        T : 范型
        urlString : 请求url地址
        params:传递参数
        callback :回掉
     */
    public static func post<T: Decodable>(_ type: T.Type, _ urlString: String, _ params: [String:String], _ callback: @escaping (T?) -> Void) {
            //传递参数
            var query = ""
            for (key, value) in params {
                query += "\(key)=\(value)&"
            }
            query.removeLast()
            //调用post请求
            post(type, urlString, query, callback)
        }
 
    public static func post<T: Decodable>(_ type: T.Type, _ urlString: String, _ params: String, _ callback: @escaping (T?) -> Void) {
            // Prepare URL
        let url = URL(string: urlString)
        guard let requestUrl = url else { fatalError() }
        // Prepare URL Request Object
        var request = URLRequest(url: requestUrl)
        request.httpMethod = "POST"
 
        // HTTP Request Parameters which will be sent in HTTP Request Body
        // Set HTTP Request Body
        request.httpBody = params.data(using: String.Encoding.utf8);
            // Perform HTTP Request
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            // Check for Error
            if let error = error {
                print("Error took place \(error)")
                return
            }
 
            // Convert HTTP Response Data to a String
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                let info = convertJsonToType(data, T.self)
                callback(info)
            }
        }
        task.resume()
    }
    
//    解析json
    private static func convertJsonToType<T: Decodable>(_ json: Data, _ toType: T.Type) -> T? {
        do {
            if T.self == Int.self {
                let dataString = String(data: json, encoding: .utf8) ?? "-1"
                let res: Int? = Int(dataString)
                return res as! T?
            }
            return try decoder.decode(toType, from: json)
        } catch {
            //解析失败
            print("Couldn't parse json as \(T.self): \n\(error)")
        }
        return nil
    }
}

创建需要的实体类对象,方便解析JSON数据

WeatherModel.swift


import Foundation
 
class weatherModel: Identifiable, Decodable {
    public var errcode: Int = 0 // 返回错误代码
    public var errmsg: String = "" //返回信息
    public var update_time: String = "" //更新时间
    public var cityid: String = "" //城市id
    public var province: String = "" //省份
    public var city: String = "" //当前城市
    public var day: dayModel = dayModel() //当天信息
    public var week: [weekModel] = [] //一周以内的信息
    public var alarm: [alarmModel] = [] //天气预警
}
 
class dayModel: Identifiable, Decodable {
    public var tem: String = "" // 当天天气温度
    public var pressure: String = "" //当天气压
    public var rain: String = "" // 当天降雨
    public var feel: String = "" //当天感觉指数
    public var wea: String = "" //当天天气
    public var wea_img: String = "" // 当天天气图标
    public var humidity: String = "" // 当天天气湿度
    public var win: String = "" //当天风向
    public var win_speed: String = "" //当天风速
    public var air: String = "" //当天空气指数
    public var air_level: String = "" //当天空气质量
}
 
class weekModel: Identifiable, Decodable {
    public var date: String = "" //
    public var week: String = "" //周几
    public var day_tem: String = "" //当天温度
    public var day_wea: String = "" //当天天气
    public var day_wea_img: String = "" //当天天气图标
    public var day_win: String = "" //当天风向
    public var day_win_speed: String = "" //当天风速
    public var night_tem: String = "" //当夜温度
    public var night_wea: String = "" //当夜天气
    public var night_wea_img: String = "" //当夜天气图标
    public var night_win: String = "" //当夜天气风向
    public var night_win_speed: String = "" //当夜风速
    public var hours: [hourModel] = [] //当天天气详情
}
 
class hourModel: Identifiable, Decodable {
    public var time: String = "" //具体时间
    public var icon: String = ""// 天气图标库
    public var wea: String = "" //天气
    public var wea_img: String = "" //天气图标
    public var tem: String = "" //天气温度
    public var rain: String = "" //
    public var win: String = "" //天气风向
    public var win_meter: String = "" //天气风速
    public var pressure: String = "" //天气压力
    public var humidity: String = "" //天气湿度
}
 
    class alarmModel: Identifiable, Decodable {
        public var alarm_type: String = "" // 预警类型
        public var alarm_level: String = "" // 预警类型
        public var alarm_title: String = "" // 预警标题
        public var alarm_content: String = "" //预警内容
    }

WeekModel.swift


 
import Foundation
 
class Week:Decodable, Identifiable {
    public var nums: Int = 0
    public var cityid: String = ""
    public var city: String = ""
    public var update_time: String = ""
    public var data:[OneDay] = []
}
 
class OneDay:Decodable, Identifiable {
    public var date: String = ""
    public var wea: String = ""
    public var wea_img: String = ""
    public var tem_day: String = ""
    public var tem_night: String = ""
    public var win: String = ""
    public var win_speed: String = ""
}

在Main.storyboard文件添加组件。可以如下图所示,具体可以按照自己需求添加即可

因为我要使用到页面跳转,所以我首页设置为NavigationController

在Main.storyboard中,选择首页,选择Editor->Embed In->Navigation Controller 如下图所示

使用Xcode制作天气APP_IOS_04

 添加组件,可参照如下图所示

使用Xcode制作天气APP_Swift_05

测试机型效果图

使用Xcode制作天气APP_Swift_06

把添加的组件绑定到ViewController里

使用Xcode制作天气APP_IOS_07

使用Xcode制作天气APP_IOS_08

这里打断一下,我写错了一点,我首页应该展示的是24小时天气情况,解析数据的方式是一样的。

在ViewController中加两个扩展(UITableViewDelegate、UITableViewDataSource),如图所示 

使用Xcode制作天气APP_Swift_09

 最后在ViewController里添加数据请求方式。完整版的代码如下


 
import UIKit
 
class ViewController: UIViewController {
    
    public var weather = weatherModel()
    var apiUrl = "" //替换为自己的API接口
    var time = ""
    var week_wea:[weekModel] = []
    var hours:[hourModel] = []
 
    override func viewDidLoad() {
        super.viewDidLoad()
        updateWeaInfo()
        // Do any additional setup after loading the view.
    }
 
    @IBOutlet weak var icon: UIImageView! //天气图标
    @IBOutlet weak var hourTable: UITableView! //一天天气
    @IBOutlet weak var weatherTem: UILabel! //天气温度
    
    
    private func updateWeaInfo() {
        HttpSender.post(weatherModel.self, apiUrl, "") {wea in
            if let data = wea {
                self.weather = data
                self.time = data.update_time
                self.week_wea = data.week
                self.hours = data.week[0].hours
            }
            DispatchQueue.main.async {
                let image = UIImage(named: self.weather.day.wea_img)
                self.icon.image = image
                self.weatherTem.text = self.weather.day.tem + "°"
                self.hourTable.dataSource = self
                self.hourTable.estimatedRowHeight = 200
                self.hourTable.rowHeight = UITableView.automaticDimension
                self.hourTable.reloadData()
            }
        }
    }
    
    
}
 
 
extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
    }
}
 
extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return hours.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = hourTable.dequeueReusableCell(withIdentifier: "hour_cell", for: indexPath) as! CellTableViewCell
        
        // 当天每小时天气
        let hour:hourModel = hours[indexPath.row]
        let time = hour.time
 
        let info = time + "的温度:" + hour.tem + "°\t" + hour.wea + "\n风向:" + hour.win + "\n风速:" + hour.win_meter + "\n湿度:" + hour.humidity + "\n气压:" + hour.pressure
    //        cell.textLabel?.text = info
        cell.label_text.text = info
        let image = UIImage(named: hour.wea_img)
        cell.icon.image = image
        return cell
        
    }
}

运行如下图所示


使用Xcode制作天气APP_Swift_10


标签:wea,String,APP,public,self,let,var,制作,Xcode
From: https://blog.51cto.com/u_16156094/12120671

相关文章

  • 京东金融APP的鸿蒙之旅:技术、挑战与实践
    一、背景在今年6月份的华为开发者大会上,华为宣布HarmonyOSNEXT面向开发者和先锋用户启动Beta升级,并将于今年四季度正式商用。在9月21日的华为2024全联接大会上华为终端总裁宣布,已有超过1万个应用和元服务上架HarmonyOSNEXT应用市场。此外,华为每年投入超过60亿元人民币激励开发者......
  • 利用ArcGIS制作土地利用面积转移图表
    1.将两个时期的土地利用栅格数据,转换为矢量数据:转换工具→由栅格转出→栅格转面→选择字段→保存2.对两个矢量图层分别进行字段融合:数据管理工具→制图综合→融合→选择融合字段→保存3.将融合后的两个矢量图层相交:分析工具→叠加分析→相交→输入要素(注意顺序)→输出......
  • UniApp组件与微信小程序组件对照学习
    UniApp只是一个第三方的开发工具,借鉴各种平台的能力,UniApp的组件也借鉴了微信小程序的组件,我们学习时,可以进行对照学习,我们在用UniApp开发微信小程序时,UniApp也只是将代码转成了微信小程序的代码,还是需要了解微信小程序开发,才能开发出微信小程序的。下面我们来进行对应学习1......
  • uniapp 安卓原生隐私政策,首次进入APP弹窗配置
    1.找到并打开manifest.json文件,点击”App启动界面配置”,找到”Android启动界面样式”,然后勾选”使用原生隐私政策提示框” 2.勾选完“使用原生隐私政策提示框”后,manifest.json文件同级会出现androidPrivacy.json文件,点击此文件后出现配置页面:{"version":"1","pr......
  • 打造同城O2O平台:外卖跑腿APP的架构与功能设计详解
    今天,小编将于大家共同讨论外卖跑腿APP的架构设计及其核心功能,旨在为开发者提供一份详尽的参考。 一、外卖跑腿APP的架构设计1.整体架构概述通常包括前端、后端和数据库。2.前端设计用户端提供直观的界面,方便用户下单、查询订单状态、进行支付等操作;骑手端则需关注接单、导航、订单......
  • MapperFeature各枚举项的作用
    枚举项作用ACCEPT_CASE_INSENSITIVE_ENUMS决定枚举反序列化是否忽略大小写。如果启用,枚举反序列化将忽略大小写。ACCEPT_CASE_INSENSITIVE_PROPERTIES决定属性名称反序列化是否忽略大小写。如果启用,属性名称反序列化将忽略大小写。ACCEPT_CASE_INSENSITIVE_VALUES......
  • 淘客返利APP开发中的性能优化实践
    淘客返利APP开发中的性能优化实践大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在淘客返利APP开发过程中,如何进行性能优化。对于一个返利APP来说,用户体验的流畅度和响应速度至关重要。如果APP响应慢、页面卡顿,用户的留存率和满......
  • Abp 使用app.UseStaticFiles配置静态文件中间件以达到创建虚拟路径
    若访问项目文件wwwroot以外的其他静态文件使用如下方式访问1.配置文件中配置路径(appsetting)"App":{"ServerRootAddress":"https://localhost:44301/","ClientRootAddress":"https://localhost:4200/","CorsOrigins":"......
  • 服务器数据恢复—SAN环境下LUN Mapping错误导致写操作不互斥,文件系统一致性出错的数据
    服务器数据恢复环境:SAN环境下一台存储设备中有一组由6块硬盘组建的RAID6磁盘阵列,划分若干LUN,MAP到不同业务的SOLARIS操作系统服务器上。服务器故障:用户新增了一台服务器,将存储中的某个LUN映射到新增加的这台服务器上。这个映射的LUN其实之前已经MAP到其他SOLARIS操作系统的服务......
  • 9.23scala中的apply和equal改写
    Scala对象的创建(1)new:使用new关键字创建类的对象(2)伴生对象:使用object关键字创建一个单例对象(3)apply:apply是一个方法,需要在伴生对象中实现这个方法 能够不使用new关键字来创建对象//创建类使用classclassStu(varname:String,vargender:String,varID:String){def......