任何对象不工作在Xcode8 beta6



在Xcode8 beta6中,下面的代码将导致一个警告:'is'测试总是为真。但是它不会打印pass。

    struct TestStruct {
    }
    //warning: 'is' test is always true
    if TestStruct() is AnyObject {
        print("pass")
    }

下面的代码将导致一个警告:从'T'到'AnyObject'的条件强制转换总是成功的

public static func register<T>(_ protocolType: T.Type, observer: T) {
    //Warning: Conditional cast from 'T' to 'AnyObject' always succeeds
    guard let object = observer as? AnyObject else {
        fatalError("expecting reference type but found value type: (observer)")
    }
    //...
}

警告正常工作:但是TestStruct() is AnyObjectfalse返回不

这个答案的前一个版本感知到警告,

'is' test总是true

作为错误,并包含了一些关于为什么这个感知到的错误警告会显示自己的讨论。然而,TestStruct() is AnyObject在运行时被评估为false被认为是预期行为。

鉴于OP (SR-2420)提交的错误报告的评论,似乎情况正好相反:因为Xcode 8/beta 6, is测试应该始终评估到true,而OP:s post的错误是TestStruct() is AnyObject在运行时评估到false的事实。

Joe Groff写道:

这是正确的,因为现在所有的桥接到AnyObject

is/as AnyObject现在总是成功的所有类型。它的行为。


用于从Swift值转换到Obj-C对象的新SwiftValue

(有关更多细节,请参阅下面评论中的讨论,谢谢@MartinR)

似乎Swift值没有显式地实现为可桥接Obj-C对象,例如通过符合_ObjectiveCBridgeable(参见以下关于_ObjectiveCBridgeable的详细信息),将自动使用新的SwiftValue框来允许转换为Obj-C对象。

swift/stdlib/public/runtime/SwiftValue的初始提交消息。mm:

运行时:实现一个不透明的'SwiftValue' ObjC类来保存桥接值

如果没有更好的映射Swift值到Objective-C对象用于桥接的目的,我们可以退回到将值装箱一个类。这个类除了存在之外没有任何公共接口在Objective-C中符合NSObject,但被Swift认可

长话短说

检查value是否有引用类型:

if type(of: value) is AnyClass {
    // ...
}

检查type是否为引用类型:

if SomeType.self is AnyClass {
   // ...
}

更多有用的答案:

  • https://stackoverflow.com/a/39185374/746347
  • https://stackoverflow.com/a/39546887/746347

相关内容

  • 没有找到相关文章

最新更新