transformedValueClass to return Array of type AnyObject

737 Views Asked by At

I'm trying to implement NSValueTransformer class named ArrayValueTransformer which is meant to transform an Array which can contain any type of object in it as follows:

class ArrayValueTransformer : NSValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return Array<AnyObject>.self
    }
}

But the return statement gives this error:

Type 'Array<AnyObject>' does not conform to protocol 'AnyObject'
2

There are 2 best solutions below

0
On
 override class func transformedValueClass() -> AnyClass {
    return NSArray.self
}
0
On

AnyClass is a typealias for AnyObject.Type. AnyObject only represents the reference types in Swift such as classes. Where as Array in Swift are value type which cannot be represented by AnyObject rather you should use Any. You could use NSArray which is a class type in Objective C which is bridged nicely to Swift Array.

class ArrayValueTransformer : NSValueTransformer {

    override func transformedValue(value: AnyObject?) -> AnyObject? {
        guard let randomString = value as? String else { return nil }
        return split(randomString.characters, isSeparator: {$0 == " "}).map{ String($0) }
    }

    override func reverseTransformedValue(value: AnyObject?) -> AnyObject? {
        guard let randomArray = value as? [String] else { return nil }
        return randomArray.reduce(" ", combine: { "\($0!) \($1)" })
    }

    override class func transformedValueClass() -> AnyClass {
        return NSArray.self
    }
}

let transformer = ArrayValueTransformer()
let transformedValue = transformer.transformedValue("J A C K")!

let originalValue = transformer.reverseTransformedValue(transformedValue)

By the way, you can use AnyObject.self. The transformdValue and reverseTransformedValue has the return type of AnyObject?, So you would need to typecast it to your type any how.