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

Cra*_*Dev 17 oop nsobject ios swift

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

class City: NSObject {

    var _name:String = ""
    var name:String {
        get {
            return _name
        }
        set (newVal) {
            _name = newVal
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var city:City!

city.name = "London" //crash here

println("name city is\(city.name)");
Run Code Online (Sandbox Code Playgroud)

当我使用消息"致命错误:在解开可选值时意外发现nil"设置名称时崩溃

Ant*_*nio 29

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

  1. 无需创建计算+存储属性(除非您有理由):

    class City: NSObject {
        var name: String = ""
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你继承NSObject,你会自动失去所有快速功能 - 避免它(除非你有理由)

    class City {
        var name: String = ""
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您使用空字符串作为缺少值 - swift 为此提供了选项

    class City {
        var name: String?
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 替代3.,没有名字的城市没有多大意义,所以你可能希望每个实例都有一个名字.使用非可选属性和初始值设定项:

    class City {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 避免隐式解包的选项(除非你有理由):

    var city: City
    
    Run Code Online (Sandbox Code Playgroud)

  • @ D4ttatraya:是的,这不是一个答案,而是五个答案,其中#2解决了我的特殊问题。好的答案很少是瞬时的。 (4认同)

Mit*_*gam 10

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

var city:City!
Run Code Online (Sandbox Code Playgroud)

这只是对象的参考.因此,这里不创建实际内存.您需要为City Class创建实际对象.

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

city = City()
Run Code Online (Sandbox Code Playgroud)


Gre*_*reg 6

您尚未初始化城市变量,当您尝试使用它时会崩溃.

在使用它之前首先初始化它:

city = City()
city.name = "London"
Run Code Online (Sandbox Code Playgroud)