时间:2021-05-02
诞生
swift 作为新起步的语言,必然抛不掉一些历史遗留包袱。用过 Objective-C 的同学肯定知道有一种叫做 id 的类型。他可以表示任意类的实例,编译器不会对其类型声明的变量进行检查。在用 swift 做 app 开发时,为了能适配 Cocoa 架构,AnyObject 就诞生了。它可以代表任意 class 类型(用来替代OC中的 id)。
区别
在 Swift 中编译器会对 AnyObject 实例的方法调用做检查,还会返回一个 Optional 的结果。
原理
? 1 2 public typealias AnyObject // The protocol to which all class types implicitly conform.由定义就可以看出它就是一个接口,所有的 class 都隐式地实现了这个借口。所以 AnyObject 只适用于 class 类型。但是 swift 中的基本类型都是 struct 类型,并不能用 AnyObject 来表示。所以官方又提出了一个更特殊的 Any 类型,它除了 class 以外还可以表示其他类型,可以说是任意类型(包括 struct,enum,func等)。
? 1 2 3 4 5 6 7 8 9 10 11 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let swiftArr = ["a", "b", "c"] let swiftStr = "hello world" var array = [AnyObject]() array.append(swiftArr) array.append(swiftStr) } }这种写法是会报错的,String 不符合预期类型 AnyObject,并且系统提示了我们怎么修改:
? 1 Argument type 'String' does not conform to expected type 'AnyObject' Insert ' as AnyObject'按提示修改后:
? 1 2 3 4 5 6 7 8 9 10 11 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let swiftArr = ["a", "b", "c"] let swiftStr = "hello world" var array = [AnyObject]() array.append(swiftArr as AnyObject) array.append(swiftStr as AnyObject) } }这里我们显示的将 swift 中的 String 和 Array 转成了 AnyObject。实际上 array 里面的元素已经变成了 NSString 和 NSArray 了。
当然我们还有另外的方式解决此问题,用 Any。
? 1 2 3 4 5 6 7 8 9 10 11 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let swiftArr = ["a", "b", "c"] let swiftStr = "hello world" var array = [Any]() array.append(swiftArr) array.append(swiftStr) } }可以看到结果全部是 swift 中的原生类型:
注意
下面来举例说明:
1.Any -- 比如我们经常使用的参数parameters
? 1 2 3 parameters = ["appId":"123456", "timestamp":203428394820, "version":"1.0", "appAuthToken":"7D8SF7D8VS8987D67687", "bizContent":["pageStart":1, "pageSize": "10","isTrue":true]] as [String : Any]这里面包括了String,Int,Bool,Dictionnary四种类型的参数,最后使用as [String : Any] ,就是说,parameters的key是String类型,但是value值可以是任何类型。
2.AnyObject -- 在做网络请求的时候
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 typealias Complicate = (AnyObject) ->Void //请求回调 var complicate : Complicate? func request(type:RequestType, URLString:String, parameters:[String : AnyObject], complicate:@escaping Complicate) -> Void { CK().maskShow() switch type { case .requestTypeGet: Alamofire.request(URLString, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: nil) .validate() .responseJSON { response in CK().dismissMask() switch response.result{ case .success: if let value = response.result.value{ //把得到的JSON数据转为字典 complicate(value as AnyObject) } case .failure: () DMCAlertCenter.default().postAlert(withMessage: "网络请求失败") return } }可以看到,在返回的json进行回调的时候,由于value是JSON类型的实例,complicate(value as AnyObject), 就是将value作为AnyObject传值出去。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://juejin.im/post/5a35477d5188257d724281d4
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以
C语言中调用Swift函数实例详解在Apple官方的《UsingSwiftwithCocoaandObjectgive-C》一书中详细地介绍了如何在Object
一、引言Swift中的类与结构体十分相似,和Objective-C不同的事,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法。Swift中的类与
参考阅读:详解js中Number()、parseInt()和parseFloat()的区别详解JS转换数值函数Number()、parseInt()、parse
C++中cerr和cout的区别实例详解前言:cerrTheobjectcontrolsunbufferedinsertionstothestandarderr