Swift:一个简单的货币转换器App在iOS10中的分析和完善
这本不算是一个完整的货币转换App,只不过是一个小巧的学习性质的程序.该App覆盖了如下几个知识点:
- 多国语言的支持
- 通过网络Api接口读取数据
最后我们来修复一个原来代码中的一个小错误作为完美的收尾工作
全部代码用最新的Xcode8.0 + swift 3.0重写,你可以了解swift最新的语法,各种简洁的爽ing…
首先从网上download三个国家的图片下来:
注意设置好图片的名称,代码中要用到.
因为本篇博文不是面向那种非常入门级的初学者,所以有些操作只是一笔带过,如果列位对于一些细节有不明白的地方,可以在下面直接回复询问.
用Xcode新建一个单视图项目,在其中加入一个Strings File,命名为Localizable.strings:
打开该文件,敲入以下内容:
"Rate" = "Rate: %@";
"Total" = "Total: %@";
"Choose Currency" = "Choose a currency";
"flagicon" = "english";
"Cancel" = "Cancel";
打开该项目(Project,注意不是Targets哦!)设置窗口的Info选项卡,在Localizations列表中新建2个配置,分别是中国和西班牙:
回到Localizable.strings文件,进入inspector选项卡,点击Localize按钮:
选择你的Base语言:
你会发现原来的Localize按钮的位置变成了你选择国家的配置内容,确保选中你新增的国家:
这时你会发现Xcode左侧的资源导航栏的Main.storyboard和Localizable.strings被扩展了:
我们发挥想象力将其内容修改为对应国家的内容吧!以下是我修改的中文语言的内容,首先是Main.strings (Chinese (Simplified)):
/* Class = "UILabel"; text = "Currency Converter"; ObjectID = "nvc-oG-Tuy"; */
"nvc-oG-Tuy.text" = "货币转换器";
/* Class = "UITextField"; placeholder = "Amount of money"; ObjectID = "taC-uW-ikM"; */
"taC-uW-ikM.placeholder" = "多少钱啊!?";
然后是Localizable.strings (Chinese (Simplified))文件:
"Rate" = "汇率: %@";
"Total" = "总额: %@";
"Choose Currency" = "选择一种货币";
"flagicon" = "china";
"Cancel" = "取消";
我们要从网络Api接口取数据,该接口的名称为:http://api.fixer.io/latest
很不幸,新版的iOS默认不允许非https开头的连接,你可以到本猫写的另一篇blog中查看解决办法:
轻松搞定ATS之后,我们需要设计UI,类似如下画面:
在把需要连接的outlet连接好之后,我们简单看一下最核心的setup方法.该方法有将近50行代码,它主要干了如下这些事:
1.根据源货币和目的货币生成url:
let url = URL(string: "\(baseurl)?base=\(fromCurrency)&symbols=\(toCurrency)")!
print("GET URL:\(url.absoluteString)")
2.建立一个session.dataTask,将取回的数据转换为json格式的对象
3.将json对象中对于的数据取出显示出来,对于需要多国语言支持的地方,我们用了以下方法:
self.rateLabel.text = String(format: NSLocalizedString("Rate", comment: ""), currencyFormatter.string(from: NSNumber(value: ratio!))!)
本项目的源代码可以到我的code中查看和下载:
https://code.csdn.net/mydo/currencyconverter/tree/master
下面我们运行一下App看看效果:
没什么意外的,下面我们进入iPhone的系统设置界面:
通用->语言和地区设置,将Language和Region选项全部改为中国,改完后的界面如下:
我们再运行一下App:
OK!不过实际测试中如果源货币和目标货币相同的话,你猜会怎么样!?
App会突然崩溃掉哦!
调试发现此时以下一句会返回nil:
let rates = json["rates"] as! [String:Double]
为了更好地解释这个错误的原因,我们手动创建一个查询url字符串,输入到浏览器中:
是滴,你没看错,从url取回的数据中rates没有内容,所以我们不能指望网络Api接口,我们需要在代码中做些调整.
进入setup方法,在开头增加一句:
var ratio:Double?
if fromCurrency == toCurrency{
ratio = 1.0
}
然后在session.dataTask的闭包中将原来ratio的位置修改如下:
if ratio == nil{
ratio = rates[self.toCurrency]
}
现在我们App可以很好地处理各种货币种类的情况了,包括源货币和目标货币相同的情况啦!
(PS:文字没有测试国家为西班牙的情况,大家可以自行测试)
Swift:一个简单的货币转换器App在iOS10中的分析和完善的更多相关文章
- 30 分钟开发一个简单的 watchOS 2 app <oneVcat>
Apple Watch 和 watchOS 第一代产品只允许用户在 iPhone 设备上进行计算,然后将结果传输到手表上进行显示.在这个框架下,手表充当的功能在很大程度上只是手机的另一块小一些的显示器 ...
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...
- Xamarin入门,开发一个简单的练手APP
之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...
- 一个简单的wed服务器SHTTPD(8)———— URI分析
//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...
- 用 Go 编写一个简单的 WebSocket 推送服务
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
- perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)
https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...
- micronaut 学习 二 创建一个简单的服务
micronaut 提供的cli 很方便,我们可以快速创建具有所需特性的应用,以下是一个简单的web server app 创建命令 mn create-app hello-world 效果 mn c ...
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- 一个简单的python线程池框架
初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...
随机推荐
- hash详解
首先介绍一下hash? 事实上是一种叫做蛤丝的病毒 hash的做法: 首先设一个进制数base,并设一个模数mod 而哈希其实就是把一个数转化为一个值,这个值是base进制的,储存在哈希表中,注意一下 ...
- C#之序列化对象(二进制方式序列化对象)
应用程序有时需要以对象的形式在磁盘上存储数据,FrameWork有两个可用的实现方式: 一:System.Runtime.Serialization.Formatters.Binarry这个名称空间包 ...
- CSS禁止输入之readonly VS disable
Readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,包括select, radio, checkbox, button ...
- 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...
- [NOIp 2016]天天爱跑步
Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图 ...
- 51nod 1486 大大走格子(容斥原理)
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- LAN、WAN、WLAN、WiFi之间的区别
感觉这几个概念让人傻傻分不清,下面以最常见的路由器来解释这几个概念. LAN 1 LAN,全称Local Area Network,中文名叫做局域网. 顾名思义,LAN是指在某一区域内由多台计算机 ...
- async/await,了解一下?
上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...
- NVisionXR for ARCore内测版开放申请
NVisionXR for ARCore引擎能够帮助开发者快速开发原生ARCore应用,只要你懂基本的Android开发,直接使用Android Studio,即可实现动画模型渲染.粒子特效.音视频播 ...