我正在尝试启动一个基于网络抓取的项目。我已经为不同的 JSON 平台设置了工具,我使用 SwiftyJSON,对于原始 HTML,我使用 hpple。我的问题是我正在尝试为内容设置一些通用类,为内容的 getter 设置一些通用类。由于每个操作都是这样,
登录 如果有用户名或密码,请提供。 如果它有验证码显示并使用结果 使用 Alamofire 获取数据 使用 JSON 或 HTML 抓取数据 填充内容类。
我想知道是否有一种方法可以定义某种协议(protocol)、枚举或通用模板,以便我可以为每个类定义那些不同的函数。我想如果我做不到这一点,我会一遍又一遍地编写相同的代码。这就是我想出的。如果您能帮助我正确设置,我将不胜感激。
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 {
}
最佳答案
这是我使用 alamofire 和 alamofire 对象映射器所做的: 第 1 步:创建符合 Mappable 协议(protocol)的模态类。
class StoreListingModal: Mappable {
var store: [StoreModal]?
var status: String?
required init?(_ map: Map){
}
func mapping(map: Map) {
store <- map["result"]
status <- map["status"]
}
}
第 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)
}
}
}
第 3 步:现在您只需调用此获取函数即可。这可以像这样完成:
self.getDataFromNetwork("your url string") { (userResponse:StoreListingModal?, error) in
}
你不仅会得到你的响应对象,它还会被映射到你的模态类。
关于json - 使用 Alamofire JSOn 和 HTML 创建通用 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008961/