1.使用www.showapi.com上的接口,需要注册添加一个App,这样才能获取appid和secret密钥,调用前需要订购套餐(选免费的就可以了); 2.外部库Podfile文件内容,SnapKit这里暂时不需要用到:

platform :ios, '8.0'
use_frameworks!

target 'WxArticle' do
  pod 'Alamofire', '~> 3.0'
  pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'
  pod 'SnapKit', '~> 0.17.0'
end

3.桥接头文件参考:http://blog.csdn.net/tujiaw/article/details/47048343 4.App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.参考:http://blog.csdn.net/tujiaw/article/details/49975761 5.请求url编码,request.swift

//
//  request.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import Foundation

class Request {
    var appId: Int

    var timestamp: String {
        return NSDate.currentDate("yyyyMMddHHmmss")
    }

    var signMethod = "md5"

    var resGzip = 0

    var allParams = [(String, String)]()

    init(appId: Int) {
        self.appId = appId
    }

    func sign(appParams: [(String, String)], secret: String) -> String {
        self.allParams = appParams
        self.allParams.append(("showapi_appid", String(self.appId)))
        self.allParams.append(("showapi_timestamp", self.timestamp))

        let sortedParams = allParams.sort{$0.0 < $1.0}
        var str = ""
        for item in sortedParams {
            str += (item.0 + item.1)
        }
        str += secret.lowercaseString
        return str.md5()
    }

    func url(mainUrl: String, sign: String) -> String {
        var url = mainUrl + "?"
        for param in self.allParams {
            url += "\(param.0)=\(param.1)&"
        }
        url += "showapi_sign=\(sign)"
        return url
    }
}

class HotWordCategoryRequest: Request {
    init () {
        super.init(appId: 17262)
    }

    func url() -> String {
        let sign = self.sign([(String, String)](), secret: "21b693f98bd64e71a9bdbb5f7c76659c")
        return super.url("http://route.showapi.com/313-1", sign: sign)
    }
}

class HotWordRequest: Request {
    var typeId = 1

    init(typeId: Int) {
        super.init(appId: 17262)
        self.typeId = typeId
    }

    func url() -> String {
        let sign = self.sign([("typeId", "\(self.typeId)")], secret: "21b693f98bd64e71a9bdbb5f7c76659c")
        return super.url("http://route.showapi.com/313-2", sign: sign)
    }
}

6.应答json解码,response.swift

//
//  response.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import Foundation
import SwiftyJSON

class Response {
    var showapi_res_code = -1
    var showapi_res_error = ""
}

struct CategoryChildItem {
    var id = 0
    var name = ""
}

struct CategoryItem {
    var name = ""
    var childList = [CategoryChildItem]()
}

class HotWordCategoryResponse: Response {
    var list = [CategoryItem]()

    func setData(data: AnyObject) {
        let json = JSON(data)
        super.showapi_res_code = json["showapi_res_code"].int ?? -1
        super.showapi_res_error = json["showapi_res_error"].string ?? ""
        if let list = json["showapi_res_body"]["list"].array {
            for item in list {
                var categoryItem = CategoryItem()
                guard let name = item["name"].string,
                    let childList = item["childList"].array else {
                        continue
                }
                categoryItem.name = name
                for child in childList {
                    guard let id = child["id"].string,
                        let name = child["name"].string else {
                            continue
                    }
                    categoryItem.childList.append(CategoryChildItem(id: Int(id)!, name: name))
                }
                self.list.append(categoryItem)
            }
        }
    }
}

struct HotWordInfo {
    var level = -1
    var name = ""
    var num = -1
    var trend = ""
}

class HotWordResponse: Response {
    var list = [HotWordInfo]()

    func setData(data: AnyObject) {
        let json = JSON(data)
        super.showapi_res_code = json["showapi_res_code"].int ?? -1
        super.showapi_res_error = json["showapi_res_error"].string ?? ""
        if let list = json["showapi_res_body"]["list"].array {
            for item in list {
                guard let name = item["name"].string else {
                    continue
                }

                var hotWordInfo = HotWordInfo()
                hotWordInfo.level = Int(item["level"].string ?? "-1") ?? -1
                hotWordInfo.name = name
                hotWordInfo.num = Int(item["num"].string ?? "-1") ?? -1
                hotWordInfo.trend = item["trend"].string ?? ""
                self.list.append(hotWordInfo)
            }
        }
    }

    func clear() {
        self.list.removeAll()
    }
}

7.数据管理,缓存,dataManage.swift

//
//  dataManage.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import Foundation

class Data {
    static let sharedManage = Data()

    var hotWordCategory = HotWordCategoryResponse()
    var hotWord = HotWordResponse()
}

8.Objective-CBridgingHeader.h

//
//  Objective-CBridgingHeader.h
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

#ifndef QueryPhoneNumber_Objective_CBridgingHeader_h

#define QueryPhoneNumber_Objective_CBridgingHeader_h


#import <CommonCrypto/CommonHMAC.h>


#endif

9.扩展String,计算md5,扩展日期格式化,extension.swift

//
//  extension.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import Foundation

extension String {
    func md5() -> String! {
        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.destroy()
        return String(format: hash as String)
    }
}

extension NSDate {
    static func currentDate(dateFormat: String) -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = dateFormat
        dateFormatter.locale = NSLocale.currentLocale()
        return dateFormatter.stringFromDate(NSDate())

    }
}

10.ViewController.swift

//
//  ViewController.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/25.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import UIKit
import Alamofire

class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.navigationItem.title = "热搜分类"
        let request = HotWordCategoryRequest()
        Alamofire.request(.GET, request.url()).responseJSON { (response) -> Void in
            if response.result.isSuccess {
                if let value = response.result.value {
                    Data.sharedManage.hotWordCategory.setData(value)
                    self.tableView.reloadData()
                }
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section < Data.sharedManage.hotWordCategory.list.count {
            let item = Data.sharedManage.hotWordCategory.list[section]
            print("child list count:\(item.childList.count)")
            //
            return Data.sharedManage.hotWordCategory.list[section].childList.count
        }
        return 0
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let CELL_ID = "HOT_WORD_CATEGORY_CELL_ID"
        let cell = tableView.dequeueReusableCellWithIdentifier(CELL_ID, forIndexPath: indexPath)
        if indexPath.section < Data.sharedManage.hotWordCategory.list.count {
            var item = Data.sharedManage.hotWordCategory.list[indexPath.section]
            if indexPath.row < item.childList.count {
                cell.textLabel?.text = item.childList[indexPath.row].name
            }
        }
        return cell
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return Data.sharedManage.hotWordCategory.list.count
    }

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if section < Data.sharedManage.hotWordCategory.list.count {
            return Data.sharedManage.hotWordCategory.list[section].name
        }
        return ""
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("index:\(indexPath.row)")
        if indexPath.section < Data.sharedManage.hotWordCategory.list.count {
            let item = Data.sharedManage.hotWordCategory.list[indexPath.section]
            if indexPath.row < item.childList.count {
                print("\(item.childList[indexPath.row].name), \(item.childList[indexPath.row].id)")
            }
        }
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "HOT_WORD_SEGUE" {
            let target = segue.destinationViewController as? HotWordTableViewController
            let indexPath = tableView.indexPathForSelectedRow
            if indexPath?.section < Data.sharedManage.hotWordCategory.list.count {
                let item = Data.sharedManage.hotWordCategory.list[(indexPath?.section)!]
                if indexPath?.row < item.childList.count {
                    target?.name = item.childList[(indexPath?.row)!].name
                    target?.typeId = item.childList[(indexPath?.row)!].id
                }
            }
        }
    }

}

11.HotWordTableViewController.swift

//
//  HotWordTableViewController.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//

import UIKit
import Alamofire

class HotWordTableViewController: UITableViewController {
    var name = ""
    var typeId = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.navigationItem.title = name
        let request = HotWordRequest(typeId: self.typeId)
        Alamofire.request(.GET, request.url()).responseJSON { (response) -> Void in
            if response.result.isSuccess {
                if let value = response.result.value {
                    Data.sharedManage.hotWord.clear()
                    Data.sharedManage.hotWord.setData(value)
                    self.tableView.reloadData()
                }
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Data.sharedManage.hotWord.list.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let CELL_ID = "HOT_WORD_CELL_ID"
        let cell = tableView.dequeueReusableCellWithIdentifier(CELL_ID, forIndexPath: indexPath)
        if indexPath.row < Data.sharedManage.hotWord.list.count {
            let item = Data.sharedManage.hotWord.list[indexPath.row]
            cell.textLabel?.text = item.name
        }
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row < Data.sharedManage.hotWord.list.count {
            let keyword = Data.sharedManage.hotWord.list[indexPath.row].name
            if let newKeyword = keyword.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) {
                if let url = NSURL(string: "https://www.baidu.com/s?wd=\(newKeyword)") {
                    UIApplication.sharedApplication().openURL(url)
                }
            }

        }
    }
}

点击热搜词可以直接打开浏览器在百度里面进行搜索。

github地址:https://github.com/tujiaw/HotSearch 截图:

这里写图片描述

这里写图片描述