如何在 swift 中使用 AnyObject 将结构转换为对象

Posted

技术标签:

【中文标题】如何在 swift 中使用 AnyObject 将结构转换为对象【英文标题】:How a struct is getting converted as an object using AnyObject in swift 【发布时间】:2016-05-05 09:39:49 【问题描述】:

在以下示例中,testString 被声明为 String 的对象,该对象是一个结构。但是我们可以使用 AnyObject 将其指定为对象。结构到对象的转换是如何快速发生的?

let testString:String = "Hello World" 
let testObject:AnyObject = testString 
print("My test object\(testObject)") // this works!

【问题讨论】:

相关:***.com/questions/24006549/… 和 ***.com/questions/32638879/…。请注意,只有在导入 Foundation 时桥接才有效。 【参考方案1】:

Swift 和 Objective C 不是独立的。在 Swift 中你可以使用 NSString。 在您的情况下,在编译期间会在 testString 之间建立一个内部桥梁并转换为 NSString 类型,这允许您将 testString 存储到 testObject 中

【讨论】:

【参考方案2】:

之所以有效,是因为编译器对StringNSString 有特殊的了解。 Swift 中的 String 可以桥接到 ObjC 中的 NSString。你可以检查它的动态类型:

let testString:String = "Hello World" 
let testObject:AnyObject = testString 
print("My test object \(testObject.dynamicType)") // object_NSContiguousString

object_NSContiguousStringNSString 集群中的私有类。

用你自己的自定义结构这样做是行不通的:

struct Person 
    var firstName = ""
    var lastName = ""


let testPerson = Person(firstName: "John", lastName: "Smith")
let testObject: AnyObject = testPerson // error

【讨论】:

以上是关于如何在 swift 中使用 AnyObject 将结构转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中检索 NSURLRequest 的 HTTPBody 参数到 Dictionary: [NSObject: AnyObject]

更新到 Swift 3.0:上下文类型“AnyObject”不能与字典文字一起使用

如何在 Swift 2.3 中将 UInt8 转换为 Anyobject

将“var touch:AnyObject?= touches.anyObject()”转换为 Swift 1.2 [重复]

在 Swift 中,对于 AnyObject,我如何 setValue() 然后调用 valueForKey()

翻译: Swift 中的委托保留周期 如何在“纯”Swift(没有@objc)中进行弱协议引用