Swift:如何在类中初始化类的实例

Swift:如何在类中初始化类的实例,swift,instance-initializers,Swift,Instance Initializers,我对初始化类中数组的实例时出现的错误感到困惑。下面的注释是xcode 6显示的错误 我创建了一个类。它具有NSMutableArray的实例。我想初始化数组(因此调用self.instancename.init()。如果我不这样做,它就会抱怨。如果我这样做,它就会抱怨 进口基金会 class testclass:NSObject { var list_of_things:NSMutableArray; init (){ // Designated initializer f

我对初始化类中数组的实例时出现的错误感到困惑。下面的注释是xcode 6显示的错误

我创建了一个类。它具有NSMutableArray的实例。我想初始化数组(因此调用self.instancename.init()。如果我不这样做,它就会抱怨。如果我这样做,它就会抱怨

进口基金会

class testclass:NSObject {

    var list_of_things:NSMutableArray;

    init (){  // Designated initializer for 'testclass' cannot delegate (swith self.init);
              // did you means this to be a convenience initializer?
        self.list_of_things.init();
              // 'init' can only refer to the initializers of 'self' or 'super'
        super.init()
              // Initializer cannot both delegate ('self.init') and chain to a superclass
              // initializer ('super.init')
    }
}

要调用另一个类的初始值设定项,只需如下调用:

self.list_of_things = NSMutableArray()
var list_of_things:NSMutableArray = NSMutableArray()
无需隐式调用
init()
函数,它是在将()添加到类名时隐式调用的

也可以在创建属性时对其进行初始化,如下所示:

self.list_of_things = NSMutableArray()
var list_of_things:NSMutableArray = NSMutableArray()

要调用另一个类的初始值设定项,只需如下调用:

self.list_of_things = NSMutableArray()
var list_of_things:NSMutableArray = NSMutableArray()
无需隐式调用
init()
函数,它是在将()添加到类名时隐式调用的

也可以在创建属性时对其进行初始化,如下所示:

self.list_of_things = NSMutableArray()
var list_of_things:NSMutableArray = NSMutableArray()

您需要为变量赋值,该变量中没有可调用的
init

init () {
    self.list_of_things = NSMutableArray()
    super.init()
}
还有几点注意:

  • 行尾不需要分号(我知道这个习惯很难打破)
  • 您不需要从NSObject继承
  • 您应该更喜欢使用本机swift数组(Array)而不是NSMutableArray
  • 类应始终以大写字母开头
  • 变量名应使用驼峰大小写而不是下划线
  • 这将是我对您的测试类的清理版本:

    class TestClass {
        var listOfThings: [AnyObject]
    
        init () {
            self.listOfThings = []
            super.init()
        }
    }
    
    实际上,如果只想初始化为空数组,甚至不需要实现init或显式指定类型:

    class TestClass {
        var listOfThings = []
    }
    

    您需要为变量赋值,该变量中没有可调用的
    init

    init () {
        self.list_of_things = NSMutableArray()
        super.init()
    }
    
    还有几点注意:

  • 行尾不需要分号(我知道这个习惯很难打破)
  • 您不需要从NSObject继承
  • 您应该更喜欢使用本机swift数组(Array)而不是NSMutableArray
  • 类应始终以大写字母开头
  • 变量名应使用驼峰大小写而不是下划线
  • 这将是我对您的测试类的清理版本:

    class TestClass {
        var listOfThings: [AnyObject]
    
        init () {
            self.listOfThings = []
            super.init()
        }
    }
    
    实际上,如果只想初始化为空数组,甚至不需要实现init或显式指定类型:

    class TestClass {
        var listOfThings = []
    }
    

    这不是在NSMutableArray上调用init的方式

    class testclass:NSObject {
    
        var list_of_things:NSMutableArray
    
        init (){ 
            self.list_of_things = NSMutableArray()
            super.init()
        }
    }
    

    去掉那些分号!这是什么?上周?

    在NSMutableArray上不是这样调用init的

    class testclass:NSObject {
    
        var list_of_things:NSMutableArray
    
        init (){ 
            self.list_of_things = NSMutableArray()
            super.init()
        }
    }
    

    去掉那些分号!这是什么?上周?

    端到端回答。没有超类,使用Swift数组,在声明端初始化列表,在
    init()中,没有要初始化的超类

    class testClass {
    
      var list_of_things = []
    
      init () { 
      }
    }
    
    126> var abc = testClass ()
    abc: testClass = {
      list_of_things = @"0 objects"
    }
    127> abc.list_of_things
    $R55: __NSArrayI = @"0 objects"
    

    端到端的答案。没有超类,使用Swift数组,在声明端初始化列表,在
    init()中,没有要初始化的超类

    class testClass {
    
      var list_of_things = []
    
      init () { 
      }
    }
    
    126> var abc = testClass ()
    abc: testClass = {
      list_of_things = @"0 objects"
    }
    127> abc.list_of_things
    $R55: __NSArrayI = @"0 objects"
    

    非常感谢。这回答了我的问题和我脑海中的许多其他问题。我同意分号只是从C和systemVerilog中习得的一种习惯。我应该把我的大脑切换到Python模式,在这里我不使用分号。除了这个:“变量名应该使用CAMEL CASE而不是下划线”——我已经在C中使用了下划线,然后在C++中使用,然后在Obj-C中使用(除非由于Objc运行时而被XXX所忽略)。我将继续在SWIFT.@superarts.org中使用下划线,当然,如果您愿意,您有权使用下划线,但是您将很难与大多数其他开发人员协作,因为绝大多数开发人员将使用camel case。不遵守约定是与他人通信的障碍。Array是Struct,而NSMutableArray是class,您无法实现某些功能。这回答了我的问题和我脑海中的许多其他问题。我同意分号只是从C和systemVerilog中习得的一种习惯。我应该把我的大脑切换到Python模式,在这里我不使用分号。除了这个:“变量名应该使用CAMEL CASE而不是下划线”——我已经在C中使用了下划线,然后在C++中使用,然后在Obj-C中使用(除非由于Objc运行时而被XXX所忽略)。我将继续在SWIFT.@superarts.org中使用下划线,当然,如果您愿意,您有权使用下划线,但是您将很难与大多数其他开发人员协作,因为绝大多数开发人员将使用camel case。不遵守约定是与他人通信的障碍。Array是Struct,而NSMutableArray是class,您无法互换实现某些功能