当前位置:K88软件开发文章中心编程语言APP编程Swift01 → 文章内容

Swift 构造过程

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:31:23

ouble? init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area }}let rectarea = Rectangle(180.0)print("面积为:\(rectarea.length)")let rearea = Rectangle(370.0)print("面积为:\(rearea.length)")let recarea = Rectangle(110.0)print("面积为:\(recarea.length)")以上程序执行输出结果为:面积为:Optional(180.0)面积为:Optional(370.0)面积为:Optional(110.0)默认构造器默认构造器将简单的创建一个所有属性值都设置为默认值的实例:以下实例中,ShoppingListItem类中的所有属性都有默认值,且它是没有父类的基类,它将自动获得一个可以为所有属性设置默认值的默认构造器class ShoppingListItem { var name: String? var quantity = 1 var purchased = false}var item = ShoppingListItem()print("名字为: \(item.name)")print("数理为: \(item.quantity)")print("是否付款: \(item.purchased)")以上程序执行输出结果为:名字为: nil数理为: 1是否付款: false结构体的逐一成员构造器如果结构体对所有存储型属性提供了默认值且自身没有提供定制的构造器,它们能自动获得一个逐一成员构造器。我们在调用逐一成员构造器时,通过与成员属性名相同的参数名进行传值来完成对成员属性的初始赋值。下面例子中定义了一个结构体 Rectangle,它包含两个属性 length 和 breadth。Swift 可以根据这两个属性的初始赋值100.0 、200.0自动推导出它们的类型Double。struct Rectangle { var length = 100.0, breadth = 200.0}let area = Rectangle(length: 24.0, breadth: 32.0)print("矩形的面积: \(area.length)")print("矩形的面积: \(area.breadth)")由于这两个存储型属性都有默认值,结构体 Rectangle 自动获得了一个逐一成员构造器 init(width:height:)。 你可以用它来为 Rectangle 创建新的实例。以上程序执行输出结果为:名字为: nil矩形的面积: 24.0矩形的面积: 32.0值类型的构造器代理构造器可以通过调用其它构造器来完成实例的部分构造过程。这一过程称为构造器代理,它能减少多个构造器间的代码重复。以下实例中,Rect 结构体调用了 Size 和 Point 的构造过程: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) }}// origin和size属性都使用定义时的默认值Point(x: 0.0, y: 0.0)和Size(width: 0.0, height: 0.0):let basicRect = Rect()print("Size 结构体初始值: \(basicRect.size.width, basicRect.size.height) ")print("Rect 结构体初始值: \(basicRect.origin.x, basicRect.origin.y) ")// 将origin和size的参数值赋给对应的存储型属性let originRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))print("Size 结构体初始值: \(originRect.size.width, originRect.size.height) ")print("Rect 结构体初始值: \(originRect.origin.x, originRect.origin.y) ")//先通过center和size的值计算出origin的坐标。//然后再调用(或代理给)init(origin:size:)构造器来将新的origin和size值赋值到对应的属性中let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))print("Size 结构体初始值: \(centerRect.size.width, centerRect.size.height) ")print("Rect 结构体初始值: \(centerRect.origin.x, centerRect.origin.y) ")以上程序执行输出结果为:Size 结构体初始值: (0.0, 0.0) Rect 结构体初始值: (0.0, 0.0) Size 结构体初始值: (5.0, 5.0) Rect 结构体初始值: (2.0, 2.0) Size 结构体初始值: (3.0, 3.0) Rect 结构体初始值: (2.5, 2.5) 构造器代理规则值类型类类型不支持继承,所以构造器代理的过程相对简单,因为它们只能代理给本身提供的其它构造器。你可以使用self.init在自定义的构造器中引用其它的属于相同值类型的构造器。它可以继承自其它类,这意味着类有责任保证其所有继承的存储型属性在构造时也能正确的初始化。类的继承和构造过程Swift 提供了两种类型的类构造器来确保所有类实例中存储型属性都能获得初始值,它们分别是指定构造器和便利构造器。指定构造器便利构造器类中最主要的构造器类中比较次要的、辅助型的构造器初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化。可以定义便利构造器来调用同一个类中的指定构造器,并为其参数提供默认值。你也可以定义便利构造器来创建一个特殊用途或特定输入的实例。每一个类都必须拥有至少一个指定构造器只在必要的时候为类提供便利构造器Init(parameters) { statements}convenience init(parameters) { statements}指定构造器实例class mainClass { var no1 : Int // 局部存储变量 init(no1 : Int) { self.no1 = no1 // 初始化 }}class subClass : mainClass { var no2 : Int // 新的子类存储变量 init(no1 : Int, no2 : Int) { self.no2 = no2 // 初始化 super.init(no1:no1) // 初始化超类 }}let res = mainClass(no1: 10)let res2 = subClass(no1: 10, no2: 20)print("res 为: \(res.no1)")print("res2 为: \(res2.no1)")print("res2 为: \(res2.no2)")以上程序执行输出结果为:res 为: 10res 为: 10res 为: 20便利构造器实例class mainClass { var no1 : Int // 局部存储变量 init(no1 : Int) { self.no1 = no1 // 初始化 }}class subClass : mainClass { var no2 : Int init(no1 : Int, no2 : Int) {

上一页  [1] [2] [3] [4]  下一页


Swift 构造过程