使用变量进行Swift转换

时间:2017-02-12 21:41:57

标签: swift

无论如何使用变量进行转换?我正在使用“AnyObject”类型的对象堆叠,我已经能够采用类类型并填充变量。现在我需要使用转换来填充数组。

var myString = "Hello World"
var objectStack = [AnyObject]()

objectStack.append(myString)

let currentObject = String(describing: objectStack.last!)
var objectType = String()
let range: Range<String.Index> = currentObject.range(of: ":")!
objectType = currentObject.substring(to: range.lowerBound)
let range2: Range<String.Index> = objectType.range(of: ".")!
objectType = objectType.substring(from: range2.upperBound)

上面的代码将评估该类并将“objectType”的值设置为“String”。现在我正试着走另一条路。像这样:

for obj in objectStack{
    obj = newObject as! objectType //this doesn't work
}

这样的事情可能吗?

2 个答案:

答案 0 :(得分:0)

获得类型有一种更简单,更安全的方法:

let type = type(of: objectStack.last!)     // String.Type
let typeString = String(describing: type)  // "String"

另一种方法是不可能的,因为在编译时不知道对象的类型。您是否想要尝试投射多种已知类型?在这种情况下,使用可选绑定来检查强制转换是否成功:

let object = objectStack.last!
if let string = object as? String {
     // do String stuff
}
else if let i = object as? Int {
     // do Int stuff
}
// and so on

如果您有大量可能的类型共享一些常用功能:使用协议。请参阅Swift Documentation以获得精彩的介绍。

您可以为不同类型可以实现的一些常用功能定义协议:

protocol Stackable {
    func doStuff()
    // (more methods or properties if necessary)
}

该协议提供了一个合同,所有符合此协议的类型都必须通过提供所有声明的方法和属性的实现来实现。让我们创建一个符合Stackable的结构:

struct Foo: Stackable {
    func doStuff() {
        print("Foo is doing stuff.")
    }
}

您还可以扩展现有类型,使其符合协议。让我们String Stackable

extension String: Stackable {
    func doStuff() {
        print("'\(self)' is pretending to do stuff.")
    }
}

让我们试一试:

let stack: [Stackable] = [Foo(), "Cat"]

for item in stack {
    item.doStuff()
}

/*
prints the following:
    Foo is doing stuff.
    'Cat' is pretending to do stuff.
*/

答案 1 :(得分:0)

这对我有用:

var instance: AnyObject! = nil
let classInst = NSClassFromString(objectType) as! NSObject.Type
instance = classInst.init()