Swift入门:教你在iOS上写个词典

2016/03/19

今天教大家在iOS上面用Swift语言写一个词典,这是一个基础教程,将会讲述布局绘制,Json数据的解析等等,从头到尾。

说道写一个词典,首先就要解决数据源的问题,我们的数据源从哪里来,在这,我们选择有道词典的API来为我们提供数据,在有道API的官网填写申请,将会获得用来申请的key,这样就可以向有道的服务器发送请求来获得词义了。

点此申请有道API

申请到API key后可以自己按照说明来试一下,直接在浏览器上看一看是否能够成功请求到有道词典,来试一下take这个单词。
Screen Shot 2016-03-20 at 10.27.06 AM

从图中看我们的请求链接是可以使用的。

2. 新建Xcode项目

好了,做好了准备工作,现在在xcode中新建项目吧!
Screen Shot 2016-03-20 at 10.30.47 AM

3. 结构设计

在小的app都需要设计他的结构,也要遵循MVP设计原则,想一想这个app的业务功能:用户输入一个单词,然后app需要根据单词组装一个请求URL,然后连接这个URL,获得一个Json数组,Json数组里面装着单词的解释。

我们需要用到的,是返回的Json数据中的Basic节点:
Screen Shot 2016-03-20 at 10.27.06 AM

可以看到,basic节点有以下几个元素

  • us-phonetic: “tek”, 美式音标

  • phonetic: “teɪk”, 音标

  • uk-phonetic: “teɪk” 英式音标

  • explains 保存着解释数组,在这里里面有三个String元素,分别储存着vi,vt和n

    现在我们需要设计一个数据类来存放这些数据,取名为Explanation,
    这是一个Model类,里面储存三个String,用来存放美式音标,英式音标,和释义。

    1. class Explanation: NSObject {
    2. var usPhonetic = ""
    3. var ukPhonetic = ""
    4. var explanan = ""
    5. }

    设计完基本的数据结构后就需要开始写关键代码了。再设计一个类,用来连接网络获取Json返回并且将Json数据转换成我们需要的Explanation实例。

    这个类,我把它叫做Query类,构造方法中传入一个String,是需要查询的单词,还要一个getExplaination方法来获取Json然后把获得的Json数据打包成Explaination。

    以下就是 getExplaination
    方法的代码,为了简单起见,我在连接互联网的时候只是为了演示使用了发送同步请求,这是一个非常危险的做法,因为同步请求的时候会阻塞UI线程,此时app的主线程会被阻塞,意味着用户在查询单词的时候运行到getExplanation方法时界面会卡住而动弹不得,直到这个方法执行结束。

    这个方法首先将requestUrl字符串包装成了NSURL类型,然后使用sendSynchronousRequest得到了一个NSData,之后使用NSJSONSerialization类中的JSONObjectWithData方法把NSdata转成了JsonObject,之后就使用valueForKey方法来得到美式音标和英式音标的String,之后是explain的NSArray,用for循环吧里面的所有String合并到一起,储存到Explaination对象中。

    1. func getExplanation() -> Explanation{
    2. let exp = Explanation()
    3. let url=NSURL(string:requestUrl);
    4. do{
    5. let data=try NSURLConnection.sendSynchronousRequest(NSURLRequest(URL:url!), returningResponse:nil)
    6. let jsonArr=try NSJSONSerialization.JSONObjectWithData(data,options:NSJSONReadingOptions.AllowFragments)
    7. let basicJson=jsonArr.valueForKey("basic")
    8. let ukPhonetic=basicJson?.objectForKey("uk-phonetic") as! String
    9. exp.ukPhonetic = ukPhonetic
    10. let usPhonetic=basicJson?.objectForKey("us-phonetic") as! String
    11. exp.usPhonetic = usPhonetic
    12. let explainArr=basicJson!.valueForKey("explains") as! NSArray
    13. for explainStr in explainArr{
    14. exp.explanan += (explainStr as! String) + "\n"
    15. }
    16. }catch {
    17. print(error)
    18. }
    19. return exp
    20. }

    以下是Query类的构造方法, 在Query实例被初始化来组装requestUrl,

    1. var requestUrl = "https://fanyi.youdao.com/openapi.dokeyfrom=MikeTech&;key=XXXXXXXX&;type=data&;doctype=json&version=1.1&;q="
    2. init(queryWord:String) {
    3. requestUrl = requestUrl + queryWord
    4. super.init()
    5. }

    好了,现在测试一下,在ViewController类的ViewDidLoad方法中加入

    Query(queryWord: “take”)

    创立一个匿名Query实例,来看看控制台有没有输出

    好了,到此我们的app已经可以拿到音标和释义并且输出到控制台了

    4. 用户界面

    现在设计这个app的用户界面,用户界面就比较简单了,需要一个输入框用来和一个按钮来提供交互,和一个UILabel,当点击按钮后,获得输入框中的输入,传入到Query类中得到Explaination实例,然后把String都取出来显示到UILabel上。

    看来我们需要在Explaination类中建立一个toString方法来把所有的音标和释义转换成一个String了

    1. func toString() -> String{
    2. return "美式音标:" + usPhonetic + "\n" + "英式音标:" + ukPhonetic + "\n\n" + "释义:\n" + explanan;
    3. }

    现在来设计界面吧。

    之后再ViewController中添加TextField和UILabel的的Outlet并且为Button添加一个点击的Action

  •