原创Blog,转载请注明出处
我的Swift教程专栏
http://blog.csdn.net/column/details/swift-hwc.html
构造是为类、结构体,枚举进行实例化做的准备。构造应当完成的是属性的初始化以及对象执行的必要准备工作。
注意:swfit的构造器不返回值
1、关键字 init
构造器以init命名
例如
class CSDN{
var name:String
init(){
name = "hellod hwc"
}
}
可以在构造的过程中指定参数
class CSDN{
var name:String
init(name:String){
self.name = name
}
}
当然,和函数一样,同样可以为构造器指定内部参数和外部参数,swift对于没有指定外部参数的参数会自动生成一个
和内部参数一样的外部参数
class CSDN{
var name:String
var ID:String
init(name:String,ID:String){
self.name = name
self.ID = ID
}
}
var instance = CSDN(name:"hello hwc",ID:"123456")
如果不希望外部参数,则用下划线_来取消外部参数
class CSDN{
var name:String
var ID:String
init(_ name:String,ID:String){
self.name = name
self.ID = ID
}
}
var instance = CSDN("hello hwc",ID:"123456")
2、默认属性值、可选属性
二者均可以不在构造器中初始化,因为默认属性值已经确保了其具有初值,而可选属性可以为nil,所以也不一定需要初始化
例如:
class CSDN{
var name = "hello hwc"
var ID:String?
}
这里可以不提供构造器
对于,所有属性已经提供默认值并且自身未定义构造器的基类或者结构体,提供一个默认的构造器
对于上述类,可以这么实用
var instance = CSDN()
3、常量属性
常量属性在构造过程中可以修改初值,但是在之后均不可以修改
class CSDN{
let name = "hello world"
init(name:String){
self.name = name
}
}
var instance = CSDN(name:"hello hwc")
4、结构体默认构造器
对于结构体,如果所有的属性都提供了默认值或者属性为可选值会自动生成一个诸一成员构造器
struct Point{
var x = 0.1
var y = 10.5
}
var instance = Point(x:1,y:2)
5、值类型的构造器代理
值构造器的代理就是调用其他迭代器来完成部分的构造过程,能够减少代码重复。
由于结构体和枚举是值类型,不支持继承,所以其构造过程相对简单。
对于类,由于支持继承,所以在构造过程中要保持继承来的属性也要构造正确。(这个内容较多,下一篇文章详解)
注意:在值类型定义了默认构造器之后,不在可访问默认构造器,以防止错误使用。如果想要使用,建议使用扩展。(后续会讲解)
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
这里定义了三个构造器,其中第三个构造器调用了第二个构造器,这就是调用简化代码的实例。
6、通过闭包和初始化属性
当某个存储属性的默认值需要复杂的准备过程,则可以使用闭包或者全局函数。
使用闭包的形式
class ModelClass{
let oneProperty:Type = {
//做一些必要的准备工作
return result//result必须和Type类型一致
}()
}
注意,闭包最后要跟个小括号,这样闭包会立刻执行,不然属性会被赋值为这个闭包,而不是闭包的结果
struct PrimeNumsOf100{
static func isPrimeNum(num:Int)->Bool{
var result = true
for index in 2...num/2{
if num % index == 0{
result = false
break
}
}
return result
}
var array:[Int] = {
var result = [2,3]
for index in 5...100{
if isPrimeNum(index){
result.append(index)
}
}
return result
}()
subscript(index:Int)->Int?{
var result:Int
if index < array.count{
result = array[index]
}
else{
result = nil
}
return result
}
}
var instance = PrimeNumsOf100()
这个属性是100以内的质数,在闭包中调用了全局函数来初始化,同时我也生声明了一个下标脚本来访问第N个质数