今天教大家在iOS上面用Swift语言写一个词典,这是一个基础教程,将会讲述布局绘制,Json数据的解析等等,从头到尾。
说道写一个词典,首先就要解决数据源的问题,我们的数据源从哪里来,在这,我们选择有道词典的API来为我们提供数据,在有道API的官网填写申请,将会获得用来申请的key,这样就可以向有道的服务器发送请求来获得词义了。
点此申请有道API
申请到API key后可以自己按照说明来试一下,直接在浏览器上看一看是否能够成功请求到有道词典,来试一下take这个单词。
从图中看我们的请求链接是可以使用的。
2. 新建Xcode项目
好了,做好了准备工作,现在在xcode中新建项目吧!
3. 结构设计
在小的app都需要设计他的结构,也要遵循MVP设计原则,想一想这个app的业务功能:用户输入一个单词,然后app需要根据单词组装一个请求URL,然后连接这个URL,获得一个Json数组,Json数组里面装着单词的解释。
我们需要用到的,是返回的Json数据中的Basic节点:
可以看到,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实例,来看看控制台有没有输出
好了,到此我们的app已经可以拿到音标和释义并且输出到控制台了
4. 用户界面
现在设计这个app的用户界面,用户界面就比较简单了,需要一个输入框用来和一个按钮来提供交互,和一个UILabel,当点击按钮后,获得输入框中的输入,传入到Query类中得到Explaination实例,然后把String都取出来显示到UILabel上。
看来我们需要在Explaination类中建立一个toString方法来把所有的音标和释义转换成一个String了
func toString() -> String{
return "美式音标:" + usPhonetic + "\n" + "英式音标:" + ukPhonetic + "\n\n" + "释义:\n" + explanan;
}
现在来设计界面吧。
之后再ViewController中添加TextField和UILabel的的Outlet并且为Button添加一个点击的Action