如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]

Posted

技术标签:

【中文标题】如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]【英文标题】:How to distinguish class in Swift 3.0(to be certain that it is not a struct or enum) [duplicate] 【发布时间】:2017-04-05 13:01:23 【问题描述】:

如何判断实例是值类型还是引用类型?

描述:

首先,我在the documentation 中阅读了AnyObject

Swift 提供了两种特殊类型来处理非特定类型:

Any 可以表示任何类型的实例,包括函数 类型:

AnyObject 可以表示任何类类型的实例。

使用任何 和 AnyObject 仅当您明确需要该行为时 他们提供的能力。最好具体一点 您希望在代码中使用的类型。

所以我决定在 Playground 中编写一些简单的代码:

struct MyStruct 
    var x = 5


let testStruct = MyStruct()

testStruct is AnyObject

if let object = testStruct as? AnyObject 
    //Do something

当看到 2 个警告时,我感到震惊。

'is' 测试总是正确的 从“MyStruct”到“AnyObject”的条件转换总是成功testStruct is AnyObject

甚至更多...我能够将我的结构设置为弱属性。

class TestClass 
    
    weak var object: AnyObject?
    


var instance: TestClass? = TestClass()


instance?.object = testStruct as AnyObject

我还没有看到任何警告或错误。它会导致崩溃或未定义的行为吗?这对我来说看起来很奇怪......

我还提到了操场上的类型。

type(of: testStruct as AnyObject) - _SwiftValue.Type type(of: testStruct) - MyStruct.Type

可能 testStruct 已隐式转换为类。但是我不确定它,并且在互联网上没有任何关于它的信息=(

你读过一些关于它的东西吗?或者你能给我一些文档链接以了解发生了什么。可能我错过了非常重要的事情。

Swift 版本:Apple Swift 版本 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1) XCode 版本:8.2.1 (8C1002)

附言

我必须强调它在 Swift 2.0 中运行良好(我认为)。

感谢关注

【问题讨论】:

Compare AnyObject not working in Xcode8 beta6? (dupe?) - everything 在 Swift 3 中可以桥接到 AnyObject。不能在 Obj-C 中直接表示的事物(例如 @987654328 @) 被放入一个不透明的 Obj-C 兼容盒中,_SwiftValueweak 对此的引用应该没问题 - 尽管因为在您的示例中您正在作业中进行装箱,它将立即被释放。 【参考方案1】:

简短的回答是:

type(of: value) is AnyClass

【讨论】:

以上是关于如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 TableView 单元格按钮

我如何继续使用 Swift 2.3 而不是 3.0,Xcode 已更新且无法再构建

我应该如何在 swift 3.0 中安装 Dropbox?

Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性

Swift 3.0:数据到JSON [String:Any]

Swift 3.0 中的 Spotify SDK:如何知道歌曲何时结束