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

dictionary-ios-feature

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

  1. 数据源

说道写一个词典,首先就要解决数据源的问题,我们的数据源从哪里来,在这,我们选择有道词典的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,用来存放美式音标,英式音标,和释义。

class Explanation: NSObject {

        var usPhonetic = ""
        var ukPhonetic = ""
        var explanan    = ""

}

设计完基本的数据结构后就需要开始写关键代码了。再设计一个类,用来连接网络获取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对象中。

 

func getExplanation() -> Explanation{

    let exp = Explanation()

    let url=NSURL(string:requestUrl);

    do{
        let data=try NSURLConnection.sendSynchronousRequest(NSURLRequest(URL:url!), returningResponse:nil)



        let jsonArr=try NSJSONSerialization.JSONObjectWithData(data,options:NSJSONReadingOptions.AllowFragments)

        let basicJson=jsonArr.valueForKey("basic")


        let ukPhonetic=basicJson?.objectForKey("uk-phonetic") as! String
        exp.ukPhonetic = ukPhonetic

        let usPhonetic=basicJson?.objectForKey("us-phonetic") as! String
        exp.usPhonetic = usPhonetic

        let explainArr=basicJson!.valueForKey("explains") as! NSArray

        for explainStr in explainArr{
           exp.explanan += (explainStr as! String) + "\n"
        }

    }catch {
        print(error)
    }

    return exp
}

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

 


     var requestUrl = "https://fanyi.youdao.com/openapi.dokeyfrom=MikeTech&;key=XXXXXXXX&;type=data&;doctype=json&version=1.1&;q="

    init(queryWord:String) {
        requestUrl = requestUrl + queryWord
        super.init()
    }

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

Query(queryWord: “take”)

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

Screen Shot 2016-03-20 at 11.24.09 AM

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

4. 用户界面

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

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

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

 

现在来设计界面吧。

Screen Shot 2016-03-20 at 11.47.53 AM

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

Screen Shot 2016-03-20 at 11.52.38 AM

然后在onTap方法中添加相应的逻辑

@IBAction func onTap(sender: AnyObject) {
    let textFieldStr = EditText.text
    let exp = Query(queryWord: textFieldStr!).getExplanation().toString()
    ExpLabel.text = exp
}

之后运行看下效果吧~

Screen Shot 2016-03-20 at 12.03.08 PM

这样一个简单地词典app就开发完了,但是他还是有很多改进的地方哦,比如单词结尾有空格会崩溃,使用了同步请求等等,留给你们来改进啦。

打赏

2 thoughts on “Swift入门:教你在iOS上写个词典

  1. ‘sendSynchronousRequest(_:returningResponse:)’ was deprecated in iOS 9.0
    you need to use NSURLSession for a a secure connection

Leave a Reply

Your email address will not be published. Required fields are marked *