12-Swift 结构体

一、结构体的介绍:

  • 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合;
  • 结构体(struct)指的是一种数据结构;
  • 结构体是值类型,在方法中传值时是值传递。

二、结构的定义格式:

struct 结构体名称{
    //属性和方法
}
struct 结构体名称{
    //属性和方法
    var name:String  //name:非可选,永远不能为nil
    var age:Int
}
//结构体的创建,会自动生成一个“逐一构造器”
//目的:保证给结构体里面所有的非可选属性赋值,保证肯定有值
let tt = 结构体名称(name: "yijiang",age:12)
tt.name     //yijiang
struct Person{
    var name: String?
    var age: Int?
}
let p1 = Person()
let p2 = Person(name: "sansan", age: nil)
p.age     //nil
struct Person{
    var name: String
    var age: Int?
}
let p = Person(name: "sansan", age: nil)
p.age     //nil
//创建p时不能把age省略,除非重写其构造函数

三、应用场景:

  • 案例:计算两点之间的距离:
struct Point{
    var x:Float
    var y:Float
}
func getDistance(第一个点 p1:Point,第二个点 p2:Point) -> Float{
    return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2))
}
let point1 = Point(x: 1, y: 2)
let point2 = Point(x: 4, y: 6)
getDistance(第一个点: point1, 第二个点: point2)   //5
  • 函数实现方案:
  • 改进:定义结构体

四、结构体扩充构造函数:

  • 默认情况下,结构体会自动创建一个“逐一构造器”;
  • 扩充构造函数:为了让我们在使用结构体时更加的灵活,Swift还可以对构造函数进行扩充;
  • 扩充的注意点:
  • 创建构造函数,不需要func关键字;
  • 在扩充的构造函数中,必须保证非可选成员变量是有值的;
  • 扩充的构造函数会覆盖原有的构造函数
struct Student{
      var name:String
      var age:Int?

      //构造函数是系统生成的函数,不需要加 func 关键字
      //如果自己扩充构造函数,会覆盖之前自动生成的逐一构造器
      //构造函数中必须保证所有的非可选属性有值
      init() {
        name = "yijiang"
      }

      init(name:String) {
        self.name = name
      }

      init(name:String,age:Int) {
        self.name = name
        self.age = age
      }
}
let s1 = Student()
s1.name  //yijiang
let s2 = Student(name: "jiang")
s2.age  //nil
s2.name     //jiang
let s3 = Student(name: "YijiangWang", age: 18)
s3.name     //YijiangWang
s3.age      //18

五、结构体扩充函数:

  • 为了让结构体使用更加灵活,Swift的结构体中可以扩充方法;
//结构体扩充函数
struct Location{
    var x:Double
    var y:Double

    //结构体是一个值传递
    //默认情况下,是不能改变实例的属性值,如果想要改变,必须要添加mutating关键字,让self实例可以改变里面的值
    mutating func moveX(x:Double) {
        self.x += x
    }
}
var l1 = Location(x: 10, y: 10);
l1.moveX(x: 12)
l1.x    //22
//用extension关键字扩充自定义结构体方法
extension Location{
    mutating func moveY(y:Double) {
        self.y += y
    }
}
var l2 = Location(x: 5, y: 6)
l2.moveY(y: 3)
l2.y    //9
  • 扩充系统的结构体方法:
  • 如果我们的结构体不是自己定义的,我们也可以扩充里面的方法,这个机制,叫做extension:
extension String{
      func run() -> String{
        return self + ",天天向上"
      }
}
let str:String = "我要好好学习"
str.run()   //"我要好好学习,天天向上"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容