为Sky定义model

这一节,我们根据之前设计的UI,设计对应的Model。

DarkSky API

首先,来了解一个简单好用的天气API服务:DarkSky。简单注册登录之后,打开Console页面就会看到一个Secret Key,以及对应的获取天气信息的方法:

DarkSkyAndModel

在图中可以看到,我们只要发送GET请求到:https://api.darksky.net/forecast/your_secret_key/latitude,longitude,就可以请求到天气信息了。当然,这个API还支持一些可选的参数,大家可以在这里找到详细的API参数。

而DarkSky返回的数据格式,大体是这样的:

{
    "latitude": 37.8267,
    "longitude": -122.4233,
    "timezone": "America/Los_Angeles",
    "currently": {
        "time": 1506417757,
        "summary": "Clear",
        "icon": "clear-night",
        "nearestStormDistance": 482,
        "nearestStormBearing": 29,
        "precipIntensity": 0,
        "precipProbability": 0,
        "temperature": 61.23,
        "apparentTemperature": 61.23,
        "dewPoint": 48.81,
        "humidity": 0.64,
        "pressure": 1010.41,
        "windSpeed": 1.76,
        "windGust": 2.97,
        "windBearing": 287,
        "cloudCover": 0,
        "uvIndex": 0,
        "visibility": 10,
        "ozone": 293.28
    },
    "minutely": {
        "summary": "Clear for the hour.",
        "icon": "clear-night",
        "data": [...]
    },
    "hourly": {
        "summary": "Clear throughout the day.",
        "icon": "clear-day",
        "data": [...]
    },
    "daily": {
        "summary": "Light rain on Monday, with temperatures falling to 69°F on Monday.",
        "icon": "rain",
        "data": [...]
    },
    "flags": {
    "sources": [...],
    "isd-stations": [...],
    "units": "us"
    },
    "offset": -7
}

大家可以在这里每个参数的详细说明。这里,我们简单说一下会用到的部分:

  • currently / minutely / hourly / daily节点包含的内容,分别表示当前,按分钟、按小时以及按天统计的天气数据。我们的App首页上半部分,就会用到currently中的内容;在稍后,我们实现首页下半部分的内容时,就会用到daily中的内容;
  • currently中,我们需要以下字段的内容:
    • time:当前时间;
    • summary:当前天气简述;
    • icon:天气图标名称,在Xcode的Assets里,我们使用的每一个图片,都和这里的图标名称是一一对应的;
    • temperature:当前温度(默认采用华氏度单位);
    • humidity:湿度;

因此,简单来说,我们需要的JSON暂时是这样的:

{
    "latitude": 37.8267,
    "longitude": -122.4233,
    "timezone": "America/Los_Angeles",
    "currently": {
        "time": 1506417757,
        "summary": "Clear",
        "icon": "clear-night",
        "temperature": 61.23,
        "humidity": 0.64
    }
}

添加API配置信息

了解了DarkSky的API格式之后,为了使用这个API,我们要添加一些接口信息。为此,在Sky group里,新建一个Configuration group,所有第三方服务的配置,都会添加在这里。现在,我们先在其中创建一个Configuratioin.swift文件,并添加下面的代码:

struct API {
    static let key = "your_secret_key_here"
    static let baseUrl = URL(string: "https://api.darksky.net/forecast")!
    static let authenticatedUrl = baseUrl.appendingPathComponent(key)
}

这样,我们就能在整个项目里,用统一的访问访问DarkSky的API了。

设计Model

添加好配置之后,我们就可以设计对应的Model了。在项目的Sky group中,新建一个Models group,我们需要创建两个models。

一个model表示当前的位置和地区名称。我们可以通过CoreLocation获取到。新建一个Location.swift文件,并添加下面的代码:

struct Location {
    var name: String
    var latitude: Double
    var longitude: Double
}

由于稍后,我们会用到定位功能,因此记得在Info.plist中添加下面的内容向用户申请权限:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Sky needs your location to fetch the weather data.</string>

另一个model则表示天气数据,这是DarkSky的返回值。新建一个WeatherData.swift文件,并添加下面的代码:

struct WeatherData: Codable {
    let latitude: Double
    let longitude: Double
    let currently: CurrentWeather

    struct CurrentWeather: Codable {
        let time: Date
        let summary: String
        let icon: String
        let temperature: Double
        let humidity: Double
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 1.网络 1.网络七层协议有哪些? 物理层:主要功能:传输比特流;典型设备:集线器、中继器;典型协议标准和应用:V...
    _我和你一样阅读 3,401评论 1 38
  • 自定义Gradle插件主要有三种形式,分别是build.gradle中编写、buildSrc工程项目中编写、独立项...
    Yolyn阅读 1,168评论 0 3
  • Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.c...
    罗田阅读 31,028评论 2 42
  • 2015/04/22更新:最新更新到Xcode6.3和Swfit 1.2。 更新日志:这个教程由Vicent Ng...
    木易林1阅读 283评论 0 0