Swift 结构体

Swift.png
结构体的介绍
  • 结构体是由一系列具有相同类型或者不同类型的数据结构构成的数据集合
  • 结构体是一种数据结构
  • 结构体是数值类型,在方法中传递时是值传递
  • 结构体的特点
    • 定义属性存储值
    • 定义方法用于提供功能
    • 定义构造器便于生成初始值
    • 定义下标操作使得可以通过下标语法来访问实例所包含的值
    • 通过扩展以增加默认实现的功能
结构的定义
  • 用struct 来结构体,并在一对大括号中定 义它们的具体内容
struct  结构体名称 {
    //在这里定义结构体,可以是属性,方法等

}

//定义一个结构体
struct Point {
    //实例属性
    var X:Double = 0.0;
    var Y:Double = 0.0;
    //实力方法
    func distance(num1:Double,num2:Double) -> Double {
        
        
        return num1*num2;
    }

//类型方法
 static  func test()  {

            print("测试")
      }
  
}

//类型方法 static  func  相当于 OC中的类方法 直接访问 Point.test()

//实力方法 func

let juli = Point.init(X: 2.5, Y: 2.6);
print(juli.distance(num1: juli.X, num2: juli.Y));
    

//注意:无论是 枚举 还是 结构体 都可以写方法
    
}
结构体的应用
struct Point {
    
    var X:Double
    var Y:Double
    
    
}

//2点的距离
func distance (p1:Point,p2:Point) ->Double {
    
    return sqrt(pow(p1.X - p2.X, 2) + pow(p1.Y - p2.Y, 2));
}

let p1 = Point.init(X: 4, Y: 5);
let p2 = Point.init(X: 0, Y: 0);

let result = distance(p1: p1, p2: p2);
print(result);
//结果:6.40312423743285

结构体的 构造函数
  • 所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中
struct Point {
    //声明2个属性
    var X:Double
    var Y:Double
  
}
//逐一构造器
 let p1 = Point.init(x: 10, y: 20);


  • 自定义构造函数 (相当于OC 中的init方法 重写)
    • 自定义构造函数不加func
    • 在构造函数内部,必须保证所有的非可选属性都必须有值
    • 我们在自定义构造函数时,系统定义的就没有了
truct Point {
    
    var X:Double
    var Y:Double
    var Z:Double
    
    //构造函数  类似OC中的初始化
    
    //不加 func
    //在构造函数内部,必须保证,所有的非可选属性,必须有值
    //如果我们现在自己定义的构造函数,那么系统自动生成的逐一构造函数器,就没有了
    
//自定义构造函数
    init(x:Double,y:Double) {
        self.X = x;
        self.Y = y;
        Z = 0; 
    }

    //重写系统 逐一构造函数器
    init(x:Double,y:Double,z:Double) {
        self.init(x: x, y: y);
        self.Z = z;
    }
   
}

 let p1 = Point.init(x: 10, y: 20);
print(p1)
//打印结果: Point(X: 10.0, Y: 20.0, Z: 0.0)

let p2 = Point.init(x: 20, y: 30, z: 40);
//打印结果:40.0 20.0 30.0

定义其他函数(类型函数和实例函数)
  • 创建实例方法
    • 默认情况下:在函数里面,是无法修改实例属性的
    • 除非:使用关键字 mutating 进行修饰,让self可以改变才可以

truct Point {
    
    var X:Double
    var Y:Double
    var Z:Double
    
    //构造函数  类似OC中的初始化
    
 
    init(x:Double,y:Double) {
        self.X = x;
        self.Y = y;
        self.Z = 0;
    }
    
    init(x:Double,y:Double,z:Double) {
        
        self.init(x: x, y: y);
        self.Z = z;
    }
    
  //创建实例方法
    //默认情况下:在函数里面,是无法修改实例属性的
    // 除非:使用关键字 mutating 进行修饰,让self可以改变才可以
    mutating func moveX(disX:Double) {
        
        return self.X += disX;
    }

}
var p1 = Point.init(x: 10, y: 20);
p1.moveX(disX: 60);

  • 创建类型方法 (相当于类方法/ +号方法)
    • 用static修饰

struct Point {
    
    var X:Double
    var Y:Double
    var Z:Double
    
    //构造函数  类似OC中的初始化
    init(x:Double,y:Double) {
        self.X = x;
        self.Y = y;
        self.Z = 0;
    }
    
    init(x:Double,y:Double,z:Double) {
        
        self.init(x: x, y: y);
        self.Z = z;
    }
  
   //类型方法
    static func SeeX(pointX:Double) {
        
        print(pointX);
    }
    
}

//调用
Point.SeeX(pointX: 10);


机构体是值类型
  • 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝
    • 注意:所有的基本类型:整数(Integer)、浮 点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是 值类型,并且在底层都是以结构体的形式所实现。
  • 在 Swift 中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属 性,在代码中传递的时候都会被复制。

struct Resolution {
    var width = 0
    var height = 0
    
    
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

// 在以上示例中,声明了一个名为hd的常量,其值为一个初始化为全高清视频分辨率(1920 像素宽,1080 像 素高)的 Resolution 实例。
然后示例中又声明了一个名为 cinema 的变量,并将 hd 赋值给它。因为 Resolution 是一个结构体,所以 的值其实是 hd 的一个拷贝副本,而不是 hd 本身。尽管 hd 和 cinema 有着相同的宽(width)和高(heigh t),但是在幕后它们是两个完全不同的实例。

//修改 
cinema.width = 2000;
print(cinema.width );
//打印结果是:2000
print(hd.width );
//打印结果是: 1920

/*
 在将 hd 赋予给 cinema 的时候,实际上是将 hd 中所存储的值进行拷贝,
然后将拷贝的数据存储到新的 cinema 实 例中。
结果就是两个完全独立的实例碰巧包含有相同的数值。
由于两者相互独立,因此将 cinema 的 width 修改为
2048 并不会影响 hd 中的 width 的值。
*/
类型扩展
  • 类型扩展的关键字是 extension
    • 格式:如下
    extension 要扩展的类型名字 {
    
    }
    
  • 像OC中的分类一样,不过在Swift中只要属于类型没救可以类型扩展
//CGpoint是系统的类型,属于结构体
//  给 CGpoint类扩展一个方法
extension CGPoint {
    mutating func moveX(cgX:CGFloat) {
        self.x += cgX;
    }
}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容