检查对象类型是否失败,"不是类型"错误

时间:2016-04-25 20:14:36

标签: ios swift

我试图检查某个对象是否属于某个类型且我收到错误:

  

' expectedClass'不是一种类型

xcode

我的代码如下。

func testInputValue(inputValue: AnyObject, isKindOfClass expectedClass: AnyClass) throws {
    guard let object = inputValue as? expectedClass else {
        // Throw an error
        let userInfo = [NSLocalizedDescriptionKey: "Expected an inputValue of type \(expectedClass), but got a \(inputValue.dynamicType)"]
        throw NSError(domain: RKValueTransformersErrorDomain, code: Int(RKValueTransformationError.UntransformableInputValue.rawValue), userInfo: userInfo)
    }
}

我试图找出这里可能出现的问题。

3 个答案:

答案 0 :(得分:3)

您应该可以使用泛型来执行此操作:

func testInputValue<T>(inputValue: AnyObject, isKindOfClass expectedClass: T.Type) throws {
    guard let object = inputValue as? T else {
        ...
    }
}

答案 1 :(得分:3)

除非您特别想测试所测试对象的类型是否与预期类完全匹配且不允许进行,否则不应按照其中一个答案中的建议与==进行类比较。测试类的子类。

您可以使用实例方法isKindOfClass来完成此操作,并将子类化考虑在内。请参阅下面的代码示例。

注意:如果NSObject / NSObjectProtocol中存在具有相同名称的实例方法,您可能会对纯Swift类类型工作感到惊讶。它确实在纯Swift中工作(如下面的示例代码所示 - 使用Xcode 7.3,Swift 2.2.1进行测试),只要您导入Foundation,就不会涉及@objc类型。基于此,我假设这个实例方法作为Foundation中的扩展方法添加到所有类类型中。

import Foundation

class A { }
class B { }
class C: B { }

enum ValueTestError: ErrorType {
    case UnexpectedClass(AnyClass)
}

func testInputValue(inputObj:AnyObject, isKindOfClass expectedClass:AnyClass) throws {
    guard inputObj.isKindOfClass(expectedClass) else {
        throw ValueTestError.UnexpectedClass(inputObj.dynamicType)
    }
}

let a = A()
let b = B()
let c = C()

do {
    try testInputValue(c, isKindOfClass: B.self)
} catch {
    print("This does not get printed as c is of type B (C is subclass of B).")
}

do {
    try testInputValue(a, isKindOfClass: B.self)
} catch {
    print("This gets printed as a is not of type B.")
}

另外,重要的是虽然isKindOfClass可用作AnyObject上的实例方法,但只有在第一次将该对象强制转换为AnyObject时才会尝试在任意Swift类类型对象上调用它(这当然会成功)。下面介绍说明这一点的示例代码,此问题还有更多Application

import Foundation

class A {}
let a = A()

// the following compiles and returns 'true'
(a as AnyObject).isKindOfClass(A.self)

// the following fails to compile with "Value of type 'A' has no member 'isKindOfClass'"
a.isKindOfClass(A.self)

答案 2 :(得分:1)

不是最好的答案,但与inputValue.dynamicType比较起作用:

if inputValue.dynamicType == expectedClass {
    print("inputValue.dynamicType \(inputValue.dynamicType) equals expectedClass \(expectedClass)")
    // ...
}