【问题标题】:swift3: Create subclass by classnameswift3:按类名创建子类
【发布时间】:2017-10-16 11:32:29
【问题描述】:

我有 2 个类 - 一个 person 超类和一个 SuperPerson 子类:

 class person { 
    var name: String     
    var age : Int 
    func instance(){}
 }

class SuperPerson : Person {
var power : Int
}

我有className = "SuperPerson",我正在使用代码:

let superPerson = NSClassFromString(className) as? Person.Type

尝试创建 SuperPerson 的实例,但该实例没有可变的权力 - 但它确实有年龄和名称

有人可以建议我哪里出错了吗?

【问题讨论】:

  • 请验证此代码是否与您的代码完全匹配。大写在 Swift 中很重要。 personPerson 不同,SuperPersonSuperPerSon 不同。 (这些应该是PersonSuperPerson。)也不清楚你在用superPerson 做什么。为什么说它“有年龄,有名字”?你怎么知道的?
  • 我的意思是,当我使用该代码创建类时,变量 superPerson 的类型为 Person 而不是 SuperPerson。 (按类名检测)
  • 此代码不创建类。我假设您最终会调用 superPerson.init() 之类的东西来创建实例?虽然这是可能的,但您已将其转换为 Person,因此编译器无法知道它具有 power 属性。但我不清楚你是如何尝试这样做的。我很难想象let superPerson... 之后的代码是什么样的。
  • 嗨 Rob,因为我不知道我要创建的类,我只知道它是 Person 类的子类,我想在 person 类中调用 func 实例。我尝试 superPerson.init() 但 xcode 错误(更改为 superPerson.type(of:init) )

标签: swift swift3


【解决方案1】:

你的代码应该是这样的:

    class Person {
    var name: String = ""
    var age : Int = 0
    func instance(){}
    }

    class SuperPerSon : Person {
    var power : Int = 0
    }

现在初始化应该是这样的

let superPerson = SuperPerSon()

然后检查它的所有属性名称、年龄、功率。

【讨论】:

    【解决方案2】:

    您在对象转换方面有误,您向下转换Person 类,然后尝试访问 SuperPerson 的属性,我做了更正您的代码,请参考以下代码。

    class Person {
        var name: String?
        var age : Int?
        func instance(){}
    
        init() {
    
        }
    }
    
    class SuperPerSon : Person {
        var power : Int?
    
        override init() {
           super.init()
        }
    }
    
         //let className = "SuperPerson"
         //let superPerson = NSClassFromString(className) as? Person.Type :this was your old line
    
     //Corrected new line is 
     let superPerson = SuperPerSon()
     superPerson.power = 10
    
     print(superPerson.power)
    

    PS:这段代码是用 swift 4 , xcode 9 编写的

    【讨论】:

    • 我猜SuperPerSonS 都是大写的。
    • 我想通过类名创建cretae类,我不知道将使用哪个类,它通过类名检测
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多