学习Swift我经常看到以下构造来制作初始化器:
class customClass: NSObject {
let what: String
let location: GeoLocation
init(what: String, location: GeoLocation){
self.what = what
self.location = location
}
这让我感到困惑,究竟是什么意思?我仍然不明白这个的全部意义,如果我已经宣布属性为什么我应该做一个初始化和那个构造? (重复变量名称和类型,然后 - self.var = var)
此外,它非常适合像UIViewController这样的类,不能创建初始化器:
class ViewController: UIViewController {
@IBOutlet var mapView : MKMapView!
private var treasures: Array<Treasure> = []
private var foundLocations: [GeoLocation] = []
private var polyline: MKPolyline!
//That class work fine without convenience or designated initializer
所以我的问题是,在swift中构造指定初始化器的确切含义,以及初始化器本身,以及我想知道的是必要的吗?我能够在头部声明变量(就像我在类ViewController:UIViewController中所做的那样)?
任何帮助,解释将不胜感激,谢谢!
答案 0 :(得分:1)
拥有初始化程序的目的是确保在使用之前正确设置类的对象。
在第一个示例中,您声明了两个不可变属性,而没有给它们赋值。调用初始化程序时,会为两个iVar指定属性,并正确初始化该类以供使用。
在第二个示例中,您正在创建可变属性(因为您声明它们是var)并且您也给它们默认值,因此即使没有初始化器,也会设置所有属性,除非在这种情况下,因为属性是可变的,您可以在以后更改它们以包含更多有用的信息。
此外,对于初始化者,Swift比Objective-C更严格。如果未在初始化程序中正确设置对象,则无法编译代码。此外,在设置所有本地属性之前,您的代码不能离开初始化程序的范围。这就是为什么在初始化子类时,在设置所有子类属性之前不要调用超类初始化器,这与在设置本地属性之前调用超类初始化器的Objective-C不同。
所有这些都来自Swift对安全性和弹性的关注。
答案 1 :(得分:-1)
您可以使用结构代替类。如果你不想做初始化。