iOS:使用Swift创建一个对象类

18

我为我的 City 对象创建了这个类。

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”设置名称时,它会崩溃。

5个回答

33

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

  1. No need to create computed + stored property (unless you have a reason for that):

    class City: NSObject {
        var name: String = ""
    }
    
  2. If you inherit from NSObject, you automatically lose all swift features - avoid it (unless you have a reason for that)

    class City {
        var name: String = ""
    }
    
  3. You are using an empty string as absence of value - swift provides optionals for that

    class City {
        var name: String?
    }
    
  4. Alternative to 3., a city without a name wouldn't make much sense, so you probably want each instance to have a name. Use non optional property and an initializer:

    class City {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
  5. Avoid implicitly unwrapped optionals (unless you have a reason for that):

    var city: City
    

1
这实际上不是一个答案! - D4ttatraya
7
@D4ttatraya:你说得对,那不是一个答案,它就像是五个答案中的第二个解决了我特定的问题。好的答案很少是瞬间出现的。 - HoldOffHunger

16

和其他面向对象编程语言一样,访问对象之前应该先对其进行初始化。
例如:



var city:City

这只是对象的引用,实际内存并没有在这里创建。你需要创建City类的实际对象。

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

city = City()

6

你还没有初始化城市变量,当你尝试使用它时会崩溃。

在使用之前先对其进行初始化:

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

我创建了一个可映射类,所以当我尝试按照您描述的方式初始化该类时,它显示建议 在调用中缺少参数“map” - Shiv Jaiswal
@ShivJ,听起来你的类需要一个变量映射参数。你应该这样做:ClassName(map),这也可以带有标签(ClassName(map: map))。没有看到代码,很难给你一个明确的答案。 - Greg

4
你之所以出现错误,是因为你没有初始化城市变量,而是在任何阶段都隐式解包它而不进行初始化。要初始化它,你必须使用以下代码。
var city:City = City()

最佳答案。此外,您仍然可以以这种方式初始化,即:var city:City = City(name: "someName")。 - HoldOffHunger

1

你需要调用init方法。所以你可以像这样做:

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

如果你没有定义一个init方法(但是最好还是定义一个),默认的init方法会被调用。


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