需要从Swift中的变量中获取instanceName作为字符串

3
假设我有以下代码行。
var instanceName = "someString"

如何以字符串格式获取实例的名称,以便将其用作在NSUserDefaults中存储变量的键?因此,在上述情况下,我希望从instanceName中获取"instanceName"。

后续问题: 如何使用字符串返回变量内容。例如:"instanceName"

1个回答

4
您可以使用class_copyIvarList从类实例中获取所有变量(据我所知,Swift不支持可选变量),遍历它们并获取名称。
var aClass : AnyClass? = self.dynamicType
var propertiesCount : CUnsignedInt = 0
let propertiesInAClass : UnsafeMutablePointer<Ivar> = class_copyIvarList(aClass, &propertiesCount)   

for var i = 0; i < Int(propertiesCount); i++ {                                
  var propName:String = NSString(CString: ivar_getName(propertiesInAClass[Int(i)]), encoding: NSUTF8StringEncoding)  
}//for

游乐场


class Myclass{

    var myInteger:Int = 1
    var myBoolean:Bool = false
    var myString:String = "heyStr"

    func printValues(){
      var aClass : AnyClass? = self.dynamicType
      var propertiesCount : CUnsignedInt = 0
      let propertiesInAClass : UnsafeMutablePointer<Ivar> = class_copyIvarList(aClass, &propertiesCount)        

      for var i = 0; i < Int(propertiesCount); i++ {
        var propName:String = NSString(CString: ivar_getName(propertiesInAClass[Int(i)]), encoding: NSUTF8StringEncoding)

        println(propName)
     }//for
    }       
}

var mc:Myclass = Myclass()
mc.printValues()

输出:

myInteger
myBoolean
myString

[编辑1]

Ivar 指的是Objective-C运行时:

/// An opaque type that represents an instance variable.
typealias Ivar = COpaquePointer

[编辑2]

如果您想获取值,需要进行两个操作:

  • NSObject继承您的类,例如:class Myclass:NSObject{..}
  • var propValue : AnyObject! = self.valueForKey(propName)

顺便提一句,如果您想将它们存储到某个字典中,请首先检查它们的类型。因为您已经将propValue定义为AnyObject


你是否知道如何使用propName返回var?我尝试了"var value: AnyObject = object_getIvar(self, class_getInstanceVariable(self.dynamicType, propName))",但是这给了我一个错误访问... - Tycho Pandelaar
@P5ycH0 你想根据名称获取值吗? - Maxim Shoustin
是的,你已经给了我获取ivar名称的解决方案。现在我需要做的就是获取我找到的每个propName的值,这样我就可以通过它的propName键将其存储在userdefaults中。我现在正在尝试“var value: AnyObject = object_getIvar(aClass, class_getInstanceVariable(aClass!, propName))”,并且我在调试器中看到了我需要的值,但仍然出现了BAD ACCESS错误... 我离解决方案如此之近... - Tycho Pandelaar
@P5ycH0 我添加了第二个编辑,但你必须修改你的问题,也许对你来说很好,但其他开发者可能会觉得我的答案与你的问题不太相关。请相应地进行修改。 - Maxim Shoustin
让我们在聊天中继续这个讨论 - Tycho Pandelaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接