使用Alamofire JSOn和HTML创建通用提取器

Mea*_*her 0 json swift alamofire

我正在尝试基于网络报废启动一个项目.我已经为JSON的不同平台设置了工具我使用SwiftyJSON,而对于原始HTML我使用了hpple.我的问题是我正在尝试为内容设置一些泛型类,并为内容的fetcher设置一些泛型类.因为每个操作都是这样的,

登录如果有用户名或密码提供它.如果它具有验证码显示并使用结果使用Alamofire Scrap获取数据,则可以使用JSON或HTML填充内容类.

我想知道是否有办法定义某种协议,枚举或通用模板,以便每个类我可以定义这些不同的功能.我想如果我做不到这一点,我会一遍又一遍地编写相同的代码.这就是我想出的.如果你能帮助我正确设置,我将不胜感激.

enum Company:Int {
    case CNN
    case BBC
    case HN
    case SO 

    var captcha:Bool {
        switch self {
        case CNN:
            return false
        case BBC:
            return true
        case HN:
            return true
        case SO:
            return false
        }
    }
    var description:String {
        get {
            switch self {
            case CNN:
                return "CNN"
            case BBC:
                return "BBC"
            case HN:
                return "Hacker News"
            case SO:
                return "Stack Overflow"
            }
        }
    }
}

class Fetcher {
    var username:String?
    var password:String?
    var url:String
    var company:Company

    init(company: Company, url:String) {
        self.url = url
        self.company = company
    }

    init(company: Company, url:String,username:String,password:String) {
        self.url = url
        self.company = company
        self.username = username
        self.password = password
    }

    func login() {

        if username != nil {
           // login
        }
        if company.captcha {
            //show captcha
        }
    }

    func fetch(){

    }

    func populate() {

    }
}

class CNN: Fetcher {


}
Run Code Online (Sandbox Code Playgroud)

Kun*_*nal 5

以下是我使用alamofire和alamofire对象映射器所做的事情:第1步:创建符合Mappable协议的模态类.

class StoreListingModal: Mappable {
var store: [StoreModal]?
var status: String?
required init?(_ map: Map){

}

func mapping(map: Map) {
    store <- map["result"]
    status <- map["status"]
}
}
Run Code Online (Sandbox Code Playgroud)

第2步:使用泛型类型创建获取请求:

func getDataFromNetwork<T:Mappable>(urlString: String, completion: (T?, NSError?) -> Void) {
    Alamofire.request(.GET, urlString).responseObject { (response: Response<T, NSError>) in
        guard response.result.isSuccess else{
            print("Error while fetching: \(response.result.error)")
            completion(nil, response.result.error)
            return
        }
        if let responseObject = response.result.value{
            print(responseObject)
            completion(responseObject, nil)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第3步:现在您只需要调用此获取功能.这可以这样做:

self.getDataFromNetwork("your url string") { (userResponse:StoreListingModal?, error) in

    }
Run Code Online (Sandbox Code Playgroud)

您不仅会获得响应对象,还会将其映射到您的模态类.