iOS:创建对象 class 和 Swift

iOS: create an object class with Swift

我为我的对象 City

创建了这个 class
class City: NSObject {

    var _name:String = ""
    var name:String {
        get {
            return _name
        }
        set (newVal) {
            _name = newVal
        }
    }
}

然后当我创建我的对象时:

var city:City!

city.name = "London" //crash here

println("name city is\(city.name)");

当我用消息 "fatal error: unexpectedly found nil while unwrapping an Optional value"

设置名称时崩溃

您还没有初始化 city 变量,当您尝试使用它时它崩溃了。

使用前先初始化:

city = City()
city.name = "London"

您收到错误消息是因为您没有初始化 city 变量,而只是隐式解包它而没有在任何阶段进行初始化。要初始化它,您必须使用以下代码

var city:City = City()

你必须调用init方法。所以你会这样做:

var city:City=City() //Calls init and creates an instance
city.name="foo"

如果您不定义 init 方法(您这样做总是一个好习惯),则会调用默认的 init 方法。

这实际上不是答案(解决方案请参阅其他答案,例如@Greg 和@zelib 的),而是尝试修复我在您的代码中看到的一些错误

  1. 不需要创建计算+存储属性(除非你有理由这样做):

    class City: NSObject {
        var name: String = ""
    }
    
  2. 如果您从 NSObject 继承,您将自动失去所有 swift 功能 - 避免它(除非您有理由这样做)

    class City {
        var name: String = ""
    }
    
  3. 您正在使用空字符串作为缺少值 - swift 为此提供 optionals

    class City {
        var name: String?
    }
    
  4. 替代 3.,没有名称的城市没有多大意义,因此您可能希望每个实例都有一个名称。使用非可选 属性 和初始化器:

    class City {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
  5. 避免隐式解包选项(除非你有理由这样做):

    var city: City
    

就像任何其他面向对象的编程语言一样,对象应该在访问之前进行初始化。
喜欢:

var city:City

这只是对象的引用。因此,实际内存并未在此处创建。您需要为 City Class.

创建实际对象

通过添加以下语句修复它:

city = City()