繁体   English   中英

快速调用AnyClass类函数

[英]Swift call AnyClass class function

根据http://www.weheartswift.com/swift-objc-magic/的文章,我创建了一个NSObject扩展来将JSON字符串解析为对象

import Foundation

extension NSObject {
    class func fromJson(jsonInfo: NSDictionary) -> Self {
        var object = self()

        (object as NSObject).load(jsonInfo)

        return object
    }

    func load(jsonInfo: NSDictionary) {
        for (key, value) in jsonInfo {
            let keyName = key as String

            if (respondsToSelector(NSSelectorFromString(keyName))) {
                setValue(value, forKey: keyName)
            }
        }
    }

    func propertyNames() -> [String] {
        var names: [String] = []
        var count: UInt32 = 0
        var properties = class_copyPropertyList(classForCoder, &count)
        for var i = 0; i < Int(count); ++i {
            let property: objc_property_t = properties[i]
            let name: String = String.fromCString(property_getName(property))!
            names.append(name)
        }
        free(properties)
        return names
    }

    func asJson() -> NSDictionary {
        var json:Dictionary<String, AnyObject> = [:]

        for name in propertyNames() {
            if let value: AnyObject = valueForKey(name) {
                json[name] = value
            }
        }


        return json
    }

}

我创建一个继承自NSObject的类

import Foundation

class Weather : NSObject {

    var date : String = ""
    var currentCity : String = ""
    var weather : String = ""
    var wind : String = ""
    var dayPictureUrl : String = ""
    var nightPictureUrl : String = ""
    var temperature : String = ""
}

然后我建立一个助手来获取API并将结果解析为对象

func requestApi(url :String, returnType: AnyClass, success: (res: AnyObject)->() ){
    var queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
    var group = dispatch_group_create()

    dispatch_group_async(group, queue) { () -> Void in
        var url = NSURL.init(string:url)
        var data = NSData.init(contentsOfURL:url!)

        let jsonObj: AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments,error:nil)

        if let topDict = jsonObj as? NSDictionary {
            var obj : AnyObject = returnType.fromJson(topDict)
            success(res: obj);
        }
    }    
}
var api : String = "http://somesite.com/jsonapi"

requestApi(api, Weather.self, { (res) -> () in
     // finish get the res obj
})

我知道如何使用Objective-C做到这一点,但是Swift我在这一行收到此错误

LINE : var obj : AnyObject = returnType.fromJson(topDict)
ERROR : 'AnyClass' does not h``ave a member named from JSON

我对Swift不太了解,我只想调用returnType类函数,该怎么办?

您的returnType被声明为AnyClass 因此,它当然没有来自Json的成员。 可能您需要声明is为具有此方法的类类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM