// 如果结构体的属性有默认值,1.在Swift中类/结果
/*
/*
结构方法:
结构体:
构造体是用于封装不一样或生机勃勃致类其他数据的, 斯维夫特中的布局体是生龙活虎类品种, 能够定义属性和方法(以至布局方法和析构方法等卡塔尔(قطر
作用: 对实例对象的剧情开展初步化
格式:
Swift必要类也许布局体中的存储属性(非lazy在卡塔尔在对象组织完结后要有开端化值
struct 布局体名称 {
构造体属性和办法
语法:
}
init(参数列表卡塔尔(قطر{ 开端化代码 }
*/
注意: 1.在Swift中类/结果提/枚举都亟需构造方法;
struct Rect {
2.布局艺术的作用只是是措辞领头化属性, 实际不是分配内容, 分配内存是系统帮大家做的;
var width: Double = 0.0
3.构造方法是隐式调用的, 通过 类名称(卡塔尔 形成创立三个指标就能够隐式调用 init(卡塔尔(英语:State of Qatar) 布局方法;
var height:Double = 0.0
4.假诺持有的蕴藏属性皆有暗许值, 能够不提供布局方法, 系统会提供三个隐式的构造方法;
}
5.假如存款和储蓄属性可以提供缺省, 那么提倡大家使用安装缺省值的方法, 那样能够简化代码(不用自定义布局方法, 不用写存储属性类型卡塔尔国
// 就算构造体的性质有默许值, 能够直接行使(卡塔尔(قطر构造贰个构造体
*/
// 假若布局体的品质未有暗许值, 必需使用各类组织器实例化布局体
class Person {
var r = Rect()
var name: String = "hjq"
print("width = (r.width), height = (r.height)")
// var age: Int = 20
var age:Int
// 构造体属性访谈 使用语法
func description() -> String {
r.width = 99.9
return "name = (name) age = (age)"
r.height = 120.5
}
print("width = (r.width), height = (r.height)")
init() {
print("init")
/*
age = 30
结构体构造器
}
Swift中的布局体和类跟别的面向对象语言同样都有构造函数, 而OC是平素不的
}
Swift供给实例化一个架构体或类的时候,全数的积极分子变量都必须要有早先值, 布局函数的意义就是用来伊始化全部成员变量的, 实际不是分配内部存款和储蓄器, 分配内存是系统帮大家做的.
// 1.分配内部存款和储蓄器; 2.初阶化name和age; 3.结构方法是隐式调用的
固然构造体中的全数属性都有私下认可值, 能够调用(卡塔尔(英语:State of Qatar)布局贰个布局体实例
var p = Person()
假诺构造体中的属性未有默许值, 能够自定义布局器, 并在布局器中给具有的习性赋值
var descripString: String = p.description(卡塔尔 //呈现调用
其实结构体有贰个暗中同意的顺序布局器, 用于在开端化时给持有属性赋值
print(p.age)
*/
print("================================")
struct Rect2 {
var width:Double
var height:Double = 0.0
/** 带有参数的布局方法 **/
}
class Person2 {
// 逐蓬蓬勃勃布局器
var name:String
var r1 = Rect2(width: 10.0, height: 10.0)
var age:Int
// 错误写法1: 顺序必得和布局体中成员的相继意气风发致
func description() -> String {
//var r1 = Rect2(height: 10.0, width: 10.0) // Error!
return "name = (name) age = (age)"
// 错误写法2: 必需含有全数成员
}
//var r1 = Rect2(width: 10.0) //Error!
//1.布局方法的中间参数, 暗中同意也是外界参数;
//2.而函数的中间参数暗中认可不会作为外界参数;
/*
//3.而艺术的中间参数, 从首个起来才会作为外界参数;
构造体中定义成员方法
//4.布局方法对品质的依次未有供给, 只要保险对象组织完时全数存款和储蓄属性被伊始化即可.
在C和OC中构造体独有总体性, 而Swift中构造体中仍能定义方法
init(age:Int, name:String)
*/
{
self.name = name
struct Rect3 {
self.age = age
var width:Double
}
var height:Double = 0.0
func setName(name:String, age:Int)
// 1.给社团体定义一个办法, 该办法归属该布局体
{
// 2.构造体中的成员方法必需使用某些实例调用
self.name = name
// 3.分子方法能够访谈成员属性
self.age = age
func getWidth() -> Double {
}
return width
}
}
var p2 = Person2(age: 25, name: "hjq")
}
p2.setName(name: "hjq", age: 30)
print(p2.description())
var r2 = Rect3(width: 10.0, height: 10.0)
//布局体中的成员方法是和有些实例对象绑定在生机勃勃道的, so, 何人调用, 方法中寻访的质量即是哪个人
p2.setName(name: "hjq", age: 23)
// 拿到r2这几个指标的上涨的幅度
print(p2.description())
print(r2.getWidth())
print("================================")
var r3 = Rect3(width: 50.0, height: 30.0)
// 获得r3那么些目的的宽度
/*
print(r3.getWidth())
常量存款和储蓄属性与布局方法
常量存款和储蓄属性只好通过缺省值或在布局方法中被改造, 其余任哪里方都不能够改改
*/
/** 构造体是值类型 **/
class Person3 {
var name:String = "hjq"
struct Rect4 {
var age:Int
var width:Double
init(age:Int, name:String)
var height:Double = 0.0
{
func show() -> Void {
self.name = name
print("width = (width) height = (height)")
self.age = age
}
}
}
func description() -> String {
return "name = (name) age = (age)"
var r4 = Rect4(width: 10.0, height: 10.0)
}
var r5 = r4
}
print(r4)
var p3 = Person3(age: 30, name: "jq")
print(r5)
print(p3.description())
//p3.name = "hello" //常量存款和储蓄属性初叶化之后不容许被改换! 虽没报错,不过不容许,那一点在背后开拓中开采验证!
/*
赋值有二种意况
1.指向同一块存款和储蓄空间
print("================================")
2.多少个不等实例, 但内容同样
*/
/**9159.com, 可选属性与布局方法 **/
r4.show()
r5.show()
class Car {
r4.width = 20.0
let name:String
init(name:String)
// 构造体是值类型, 布局体之间的赋值其实是将r4中的值完全拷贝风流浪漫份到r5中, 所以他们多少个是莫衷一是的实例
{
r4.show()
self.name = name
r5.show()
}
}
class Person4 {
let name:String
var age:Int
var car:Car?
//1.可选值存款和储蓄属性可以不再布局方法中最早化;
//2.也正是说可选值在对象组织完结后不要开头化;
//3.其实若是不对可选存储属性举办初步化, 私下认可便是nil
init(age:Int, name:String)
{
self.age = age
self.name = name
}
func description() -> String {
return "name = (name) age = (age)"
}
}
/** 布局体与构造方法 **/
struct Rect {
//当时既未有提供缺省值, 也未有提供布局方法, 不过编写翻译通过
//因为暗许意况下, 布局心得给结构体提供叁个暗许的积极分子相继构造器
var width:Double = 0.0
var height:Double = 0.0
/*
// 系统暗中同意会提供三个好像的法子
init(width:Double, height:Double)
{
self.width = width
self.height = height
}
*/
/*
init() {
self.width = 0.0
self.height = 0.0
}
*/
}
// 注意: 1.在类中暗中同意是从未各类构造器的
// 2.大器晚成旦在构造体中自定义了结构方法, 那么系统不会扭转暗中同意的依次构造器
// 3.倘使给存款和储蓄属性提供了缺省值, 系统或许会提供暗中认可的逐一构造器
//var r = Rect(width: 1.0, heigth: 1.0)
// 4.只要给存款和储蓄属性提供了缺省值, 能够应用不带参数的措施初步化构造体
var r = Rect()
/*
"值类型"的布局器代理
结构器代理: 布局方法之间的竞相调用
布局方法能够调用其余布局方法来成功实例的组织, 称之为布局器代理
好处: 减少构造方法之间的双重代码
*/
struct Rect2 {
var width:Double, height:Double
init(width:Double, height:Double)
{
self.width = width
self.height = height
}
init()
{
// self.width = 0.0
// self.height = 0.0
//构造器代理
self.init(width: 0, height: 0)
}
func show()
{
print("width = (width) height = (height)")
}
}
var r2 = Rect2()
r2.show()
var r3 = Rect2(width: 100, height: 100)
r3.show()
print("================================")
/*
通过闭包恐怕全局函数/类格局 设置存款和储蓄属性的缺省值
假使急需经过测算, 恐怕需求举行部分相当的操作才干显著早先值时就足以经过闭包或全局函数设置存款和储蓄属性的缺省值
*/
func getValue() ->Int
{
print("getValue")
return 55
}
class Person5 {
var name:String
//系统在开头化的时候会隐式奉行闭包, 将闭包的执行结果赋值给存款和储蓄属性
//注意: 闭包前面鲜明要有(卡塔尔, 代表执行闭包
var age:Int = {
(卡塔尔(قطر -> Int in // 那风姿罗曼蒂克行能够轻易, 重临值是足以省略的,私下认可重返值的花色便是积攒属性的档案的次序
print("age 闭包")
return 30
}()
lazy var height:Double = {
print("lzay 闭包")
return 180.0
}()
var age2:Int = getValue()
var age3:Int = Person5.getValue2()
//1.不能够如此写, 因为调用方法时对象还并未开首化实现;
//2.self唯有当全数的蕴藏属性都开始化落成之后才得以用.
// var age3:Int = Person5.getValue3()
init(name:String) {
self.name = name
}
class func getValue2() ->Int {
print("class getValue2")
return 100
}
func getValue3() -> Int {
return 99
}
}
var p5 = Person5(name: "hjq")
//懒加载是用到才实践, 而闭包赋值是开首化时就能实践
print(p5.height)
本文由9159.com发布于编程,转载请注明出处:// 如果结构体的属性有默认值,1.在Swift中类/结果
关键词:
下一篇:没有了