如何区分 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 兼容盒中,_SwiftValue
。 weak
对此的引用应该没问题 - 尽管因为在您的示例中您正在作业中进行装箱,它将立即被释放。
【参考方案1】:
简短的回答是:
type(of: value) is AnyClass
【讨论】:
以上是关于如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
我如何继续使用 Swift 2.3 而不是 3.0,Xcode 已更新且无法再构建
Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性