Swift的构造过程
构造过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务
与 Objective-C 中的构造器不同,Swift 的构造器
无需返回值
,它们的主要任务是保证新实例在第一次使用前完成正确的初始化
Swift构造函数使用init()
方法
init()
{
// 实例化后执行的代码
}
存储型属性的初始赋值
存储属性在构造器中的赋值流程:
创建初始值
↓
在属性定义中指定默认属性值
↓
初始化实例,并调用init()方法
类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值,存储属性在构造器中赋值时,它们的值是被直接设置的,不会触发任何属性观测器。
struct rectangle {
var length:Double
var breadth:Double
//以关键字init命名的不带任何参数的最简构造器
init (){
//为储值属性设置初始值
length = 6
breadth = 12
}
}
调用
let area = rectangle()
print("矩形的面积\(area.length*area.breadth)")
调用结果
矩形的面积72.0
默认属性值的构造器
在属性声明时为其设置默认值
通过设置默认值可以使构造器更简洁、更清晰、还能通过默认值自动推导出属性的类型
struct rectangle {
// 设置默认值
var length = 6
var breadth = 12
}
构造参数
在定义构造器init()
时提供构造参数
//构造参数
struct Rectangle {
var length:Double
var breadth:Double
var area:Double
//外部参数名(fromLength、fromBreadth)
init(fromLength length:Double,fromBreadth breadth:Double){
self.length = length
self.breadth = breadth
area = length * breadth;
}
}
调用
func RectangleFunc(){
let area = Rectangle(fromLength: 10, fromBreadth: 2)
print("面积为:\(area.area)")
}
调用结果
面积为:20.0
内部和外部参数名
在定义构造器如果没有提供参数的外部名字,Swift 会为每个构造器的参数
自动生成一个跟内部名字相同的外部名
。
//内部和外部参数名
struct Color {
let red, green, blue:Double
//没有提供参数的外部名字
init (red:Double,green:Double,blue:Double){
self.red = red
self.green = green
self.blue = blue
}
init(white:Double){
red = white;
green = white
blue = white
}
}
调用
func colorFunc(){
// 创建一个新的Color实例,调用构造器 自动生成跟内部名字相同的外部名(red、green、blue)
let magentaColor = Color(red: 1.0, green: 0.0, blue: 1.0)
print("magentaColor-red:\(magentaColor.red)")
print("magentaColor-green:\(magentaColor.green)")
print("magentaColor-blue:\(magentaColor.blue)")
let halfGray = Color(white: 0.5)
print("halfGray-red:\(halfGray.red)")
print("halfGray-green:\(halfGray.green)")
print("halfGray-blue:\(halfGray.blue)")
}
调用结果
magentaColor-red:1.0
magentaColor-green:0.0
magentaColor-blue:1.0
halfGray-red:0.5
halfGray-green:0.5
halfGray-blue:0.5
没有外部名称参数
如果不希望为构造器的某个参数提供外部名字,你可以使用
下划线_
来显示描述它的外部名
//没有外部名称参数
struct Frame {
var length:Double
//外部参数名 fromLen
init(fromLen len:Double){
length = len * 10
}
//不提供外部参数名用”_“代替
init(_ len:Double){
length = len
}
}
调用
func FrameFunc() {
//调用提供外部参数名
let rectLength = Frame(fromLen: 11)
print("长为:\(rectLength.length)")
//调用不提供外部参数名的构造函数
let rectLen = Frame(13)
print("长为:\(rectLen.length)")
}
调用结果
长为:110.0
长为:13.0
网友评论