Swift 使用变量进行快速转换

Swift 使用变量进行快速转换,swift,Swift,是否仍然可以使用变量进行转换?我使用“AnyObject”类型的对象堆栈,并且我能够获取类类型并填充变量。现在我需要使用转换填充一个数组 var myString = "Hello World" var objectStack = [AnyObject]() objectStack.append(myString) let currentObject = String(describing: objectStack.last!) var objectType = String() let r

是否仍然可以使用变量进行转换?我使用“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)

这样做可能吗?

有一种更简单、更安全的方法来获取类型:

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
如果有大量可能的类型共享一些公共功能:使用协议。请参阅,以获得一个很好的介绍

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

protocol Stackable {
    func doStuff()
    // (more methods or properties if necessary)
}
该协议提供了一个契约,所有符合该协议的类型都必须通过为所有声明的方法和属性提供实现来实现该契约。让我们创建一个符合
Stackable
的结构:

struct Foo: Stackable {
    func doStuff() {
        print("Foo is doing stuff.")
    }
}
extension String: Stackable {
    func doStuff() {
        print("'\(self)' is pretending to do stuff.")
    }
}
还可以扩展现有类型,使其符合协议。让我们将
字符串设置为可堆叠的

struct Foo: Stackable {
    func doStuff() {
        print("Foo is doing stuff.")
    }
}
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.
*/
这对我很有用:

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

当然不是,因为
objectType
是一个
String
而不是一个元类型。但即使它是一个元类型,它的值在运行时之前是未知的,所以在编译时它有什么用途呢?换一种说法,你希望
obj
被静态输入为什么?@Hamish,我很可能是走错了路。也许我需要重新考虑一下,回到绘图板上。很可能–一般来说,你应该避免使用
Any
/
AnyObject
。您计划将哪些类型的值放入
objectStack
?它们在某种程度上是相关的吗?这就是我目前正在做的,尽管我正在使用一个开关。问题是在我的应用程序中有很多可能的对象类型。我本来希望避免为每个对象构建一个开关盒,但现在看来这是不可避免的了?对象类型有共同的功能吗?如果是:使用协议。非常感谢。我会开始研究这个。我想我该到此为止了,我的头因为是个新手而开始痛了当然可以我用一些提示更新了我的答案,让您开始使用协议。