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

Swift 构造过程

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

self.no2 = no2 super.init(no1:no1) } // 便利方法只需要一个参数 override convenience init(no1: Int) { self.init(no1:no1, no2:0) }}let res = mainClass(no1: 20)let res2 = subClass(no1: 30, no2: 50)print("res 为: \(res.no1)")print("res2 为: \(res2.no1)")print("res2 为: \(res2.no2)")以上程序执行输出结果为:res 为: 20res2 为: 30res2 为: 50构造器的继承和重载Swift 中的子类不会默认继承父类的构造器。父类的构造器仅在确定和安全的情况下被继承。当你重写一个父类指定构造器时,你需要写override修饰符。class SuperClass { var corners = 4 var description: String { return "\(corners) 边" }}let rectangle = SuperClass()print("矩形: \(rectangle.description)")class SubClass: SuperClass { override init() { //重载构造器 super.init() corners = 5 }}let subClass = SubClass()print("五角型: \(subClass.description)")以上程序执行输出结果为:矩形: 4 边五角型: 5 边指定构造器和便利构造器实例接下来的例子将在操作中展示指定构造器、便利构造器和自动构造器的继承。它定义了包含两个个类MainClass、SubClass的类层次结构,并将演示它们的构造器是如何相互作用的。class MainClass { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[匿名]") }}let main = MainClass(name: "Runoob")print("MainClass 名字为: \(main.name)")let main2 = MainClass()print("没有对应名字: \(main2.name)")class SubClass: MainClass { var count: Int init(name: String, count: Int) { self.count = count super.init(name: name) } override convenience init(name: String) { self.init(name: name, count: 1) }}let sub = SubClass(name: "Runoob")print("MainClass 名字为: \(sub.name)")let sub2 = SubClass(name: "Runoob", count: 3)print("count 变量: \(sub2.count)")以上程序执行输出结果为:MainClass 名字为: Runoob没有对应名字: [匿名]MainClass 名字为: Runoobcount 变量: 3类的可失败构造器如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器。变量初始化失败可能的原因有:传入无效的参数值。缺少某种所需的外部资源。没有满足特定条件。为了妥善处理这种构造过程中可能会失败的情况。你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器。其语法为在init关键字后面加添问号(init?)。实例下例中,定义了一个名为Animal的结构体,其中有一个名为species的,String类型的常量属性。同时该结构体还定义了一个,带一个String类型参数species的,可失败构造器。这个可失败构造器,被用来检查传入的参数是否为一个空字符串,如果为空字符串,则该可失败构造器,构建对象失败,否则成功。struct Animal { let species: String init?(species: String) { if species.isEmpty { return nil } self.species = species }}//通过该可失败构造器来构建一个Animal的对象,并检查其构建过程是否成功// someCreature 的类型是 Animal? 而不是 Animallet someCreature = Animal(species: "长颈鹿")// 打印 "动物初始化为长颈鹿"if let giraffe = someCreature { print("动物初始化为\(giraffe.species)")}以上程序执行输出结果为:动物初始化为长颈鹿枚举类型的可失败构造器你可以通过构造一个带一个或多个参数的可失败构造器来获取枚举类型中特定的枚举成员。实例下例中,定义了一个名为TemperatureUnit的枚举类型。其中包含了三个可能的枚举成员(Kelvin,Celsius,和 Fahrenheit)和一个被用来找到Character值所对应的枚举成员的可失败构造器:enum TemperatureUnit {    // 开尔文,摄氏,华氏 case Kelvin, Celsius, Fahrenheit init?(symbol: Character) { switch symbol { case "K": self = .Kelvin case "C": self = .Celsius case "F": self = .Fahrenheit default: return nil } }}let fahrenheitUnit = TemperatureUnit(symbol: "F")if fahrenheitUnit != nil { print("这是一个已定义的温度单位,所以初始化成功。")}let unknownUnit = TemperatureUnit(symbol: "X")if unknownUnit == nil { print("这不是一个已定义的温度单位,所以初始化失败。")}以上程序执行输出结果为:这是一个已定义的温度单位,所以初始化成功。这不是一个已定义的温度单位,所以初始化失败。类的可失败构造器值类型(如结构体或枚举类型)的可失败构造器,对何时何地触发构造失败这个行为没有任何的限制。但是,类的可失败构造器只能在所有的类属性被初始化后和所有类之间的构造器之间的代理调用发生完后触发失败行为。实例下例子中,定义了一个名为 StudRecord 的类,因为 studname 属性是一个常量,所以一旦 StudRecord 类构造成功,studname 属性肯定有一个非nil的值。class StudRecord { let studname: String! init?(studname: String) { self.studname = studname if studname.isEmpty { return nil } }}if let stname = StudRecord(studname: "失败构造器") { print("模块为 \(stname.studname)")}以上程序执行输出结果为:模块为 失败构造器覆盖一个可失败构造器就如同其它构造器一样,你也可以用子类的可失败构造器覆盖基类的可失败构造器。者你也可以用子类的非可失败构造器覆盖一个基类的可失败构造器。你可以用一个非可失败构造器覆盖一个可失败构造器,但反过来却行不通。一个非可失败的构造器永远也不能代理调用一个可失败构造器。实例以下实例描述了可失败与非可失败构造器:class Planet { var name: String init(name: String) { self.name = name } convenience init() { self

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


Swift 构造过程