Swift语言入门知识点(二)

上一篇文章与大家分享了一些Swift语言最基础的语法入门,今天来继续和大家接着上面的来分享,今天的知识点包括:函数、类、结构体、协议 的一些相关使用。
学习完这些知识点大家基本就掌握了Swift语言中的大部分语法,再了解学习一下Swift在实际开发中的一些应用,以及与OC混编的桥接就基本可以独立写一些小项目来练手了(前提熟悉UIKit下大部分控件的使用)。

下面话不多说还是直接上代码。

<pre><code>
//MARK:-----------------函数相关-----------------

//上面这一行代码相当于OC的#pragma mark -

//定义函数

func eat() {

  print("eating....")

}

//调用函数

eat()

//定义带有参数和返回值的函数

//func 函数名(参数:参数类型) -> 返回值类型

func run(a: Int, b: Int) -> Int {

  return a + b

}

var r = run(10, b: 5)

print(r)

//元组作为函数的返回值

func jump(a: Int ,b: Int) -> (a1: Int, b1: Int) {

  return (a * 10, b * 10)

}

var g = jump(2, b: 3)

print(g.b1)

//制作函数的外部参数,作用是提示每个参数的含义

func walk(name param1: String, age param2: Int) {

  print("name:\(param1) age:\(param2)")

}

walk(name: "奥特曼", age: 100)

//忽略外部参数

func drink(name param1: String, _ param2: Int) {

  print("name:\(param1) age:\(param2)")

}

drink(name: "小怪兽", 200)

//函数默认的参数值

func add(a: Int, b: Int = 25) -> Int {

  return a + b

}

print(add(10))

print(add(5, b: 50))

//声明可变参数的函数

func sum(numbers: Int...) -> Int {

  var sumst = 0
  for i in numbers {
      sumst += i
  }
  return sumst

}

//此函数可以写多个参数

print(sum(1, 2, 3, 5, 10))

//函数的变量参数和常量参数

//任何函数的参数默认都为let类型

func sub(var a: Int, b: Int) -> Int {

  //在函数中需要直接修改参数值时,则应该在该参数前添加var
  a += b
  return a

}

print(sub(10, b: 1))

//函数的输入输出参数 inout,在函数内会改变传入参数需要用到

func changeTwoWord(inout a: Int, inout b: Int) {

  //在Swift函数中,如果声明的tmp不需要参与运算或改变时,一般都会声明常量let
  let tmp = a
  a = b
  b = tmp

}

var t1 = 10

var t2 = 20

changeTwoWord(&t1, b: &t2)

print("t1 is (t1)\nt2 is (t2)")

//函数类型的使用

func addTwoWord(a: Int, b: Int) -> Int {

  return a + b

}

func subTwoWord(a: Int, b: Int) -> Int {

  return a - b

}

//以上两个函数的函数类型为 (Int, Int) -> Int

//将一个变量的类型定义为一个函数类型,则此变量就可以当做该函数来使用

var ts: (Int, Int) -> Int = addTwoWord

print(ts(10, 20))

//函数类型作为参数使用

func test1(a: (Int, Int) -> Int, b: Int, c: Int) -> Int {

  //这里的a就代表了 (Int, Int) -> Int 此类型函数
  return a(b, c)

}

print(test1(addTwoWord, b: 10, c: 30))

//函数类型当作返回值

func test2(a: Int, b: Int) -> (Int, Int) -> Int {

  if a + b > 10 {
      return addTwoWord
  } else {
      return subTwoWord
  }

}

var va = test2(10, b: 20)

print(va(2, 3))

//MARK:-----------------类与结构体的使用-----------------

//定义类

class Student {

  //定义属性
  var name = ""
  var age = 0
  //方法

}

//定义结构体

struct ClassNumber {

  //定义属性
  var myClass = 20
  var myGrade = 5

}

//实例化学生类

var student = Student()

//调用学生类中的属性

student.name = "老王"

student.age = 66

print("姓名:(student.name) 年龄:(student.age)")

//实例化班级结构体

var classnumber = ClassNumber()

classnumber.myClass = 100

classnumber.myGrade = 30

print("(classnumber.myClass) (classnumber.myGrade)")

//类和结构体的混合编程

struct Hand {

  //为手初始化为0
  var numberOfHand = 0

}

class Person {

  var name = ""
  var age = 0
  //当类中包含自定义类型,需要将自定义类型初始化
  var hand: Hand = Hand()

}

//创建人类对象

var person = Person()

person.name = "凹凸曼"

person.age = 23

person.hand.numberOfHand = 2

print("具有 (person.hand.numberOfHand) 只手的 (person.name) 年龄是 (person.age)")

//MARK:-----------------逐一构造器的使用-----------------

//�结构体具有逐一构造器,但是类没有,因为结构体属于值类型,类属于引用类型

struct Dog {

  var name = ""
  var age = 0

  //在值类型中定义实例方法,并在实例方法中修改属性
  mutating func eat() {
      self.name = "xiaowang"
  }

}

//通过逐一构造器创建狗对象

var dog = Dog(name: "旺财", age: 5)

//值类型的特点为,当赋值给变量常量或函数时,是通过拷贝的形式进行了赋值

var dog2 = dog

//修改dog的名字

dog.name = "小黑"

print(dog.name)

print(dog2.name)

class Cat {

  var name = ""
  var age = 0

}

var cat = Cat()

cat.name = "花花"

cat.age = 18

//引用类型给变量常量或函数赋值时,就是做了指针的指向,内存中并没有拷贝

var cat2 = cat

cat2.name = "加菲猫"

print(cat.name)

print(cat2.name)

//恒等运算符 ===,作用为判断两个由类创建的对象是否相等,不能判断结构体的对象是否相等

if cat === cat2 {

  print("两个类对象相同")

}

//MARK:--------------------实例方法与类方法---------------------

//实例方法,类方法的特点

class Tiger {

  var name = ""
  var age = 0
  //创建实例方法
  func eat() {
    print("eat meat...")
    //在实例方法中 self 就是当前类的对象
    self.name = "跳跳虎"
  }

  func run(name: String) {
    //可以通过self区分属性和形参
    self.name = name
  }
  //声明类方法,可以通过static或class去声明
  static func bark() {
    print("barking...")
  }

}

//调用实例方法

var tiger = Tiger()

//无论调用属性还是实例方法,都是通过 点 去调用

tiger.eat()

print(tiger.name)

//通过类名调用类方法

Tiger.bark()

class Car {

  var name = ""
  var price = 0.0

  //可以通过final 关键字设置该方法不被子类重写
  func run() {
    print("running...")
  }

}

//MARK:-------------------继承---------------------

//通过类的继承,子类可以继承父类的所有属性和方法

//Swift语言中不允许多继承,但是OC,Swift可以多层继承

class DasAuto: Car {

  var factory = "长春"

}

//创建DasAuto对象

var das = DasAuto()

das.name = "大众"

das.price = 22.22

das.run()

print("(das.name) (das.price) (das.factory)")

class Golf: DasAuto {

  var size = 11
  //在子类中重写父类的方法
  override func run() {
    print("golf running...")
  }

}

var golf = Golf()

golf.name = "高尔夫"

golf.run()

print("(golf.name) (golf.size)")

//MARK:----------------------构造函数----------------------

//构造函数的使用

class Bird {

  var name = ""
  var age = 0
  let weight: Double
  //创建构造方法
  //构造方法的作用为当类被实例化时,第一个调用的方法
  //Swift中的构造函数,可以给let赋值
  init() {
    print("I am a bird")
    self.weight = 1.3
  }
  //带有内部参数的构造方法
  init(name: String) {
    self.name = name
    self.weight = 2.3
  }
  //带有外部参数的构造方法
  init(name param1: String, age param2: Int) {
    self.name = param1
    self.age = param2
    self.weight = 3.3
  }
  //隐藏外部参数的构造函数
  init(_ param1: String, _ param2: Int) {
    self.name = param1
    self.age = param2
    self.weight = 4.4
  }

}

//创建鸟的对象

//var bird = Bird()

//var bird = Bird(name: "小怪兽")

//var bird = Bird(name: "小鸟", age: 3)

var bird = Bird("鸟", 2)

print(bird.name)

class FlyBird: Bird {

  //在子类中重写父类中的构造方法
  override init() {
    //调用父类中对应的构造方法,这一步的必须的
    super.init()
  }
  //定义析构函数,当类对象为nil 的时候回调用
  deinit {
    print("析构函数~~~")
  }

}

var flyBird: FlyBird? = FlyBird()

//当flyBird = nil 调用析构函数

flyBird = nil

//MARK:--------------------扩展---------------------

//Swift中的扩展,相当于OC中的类别(类目)

extension Int {

  //为Int类型扩展一个属性,求平方
  var a: Int {
    return self * self
  }

}

print(5.a)

extension Bird {

  //扩展属性
  var birdColor: String {
    return self.name + "是白颜色"
  }

  //扩展方法
  func singSong() {
    print("\(self.name) 在唱歌")
  }

}

//通过扩展向父类中添加的属性、方法也可以传递给子类

var exBird = FlyBird()

exBird.name = "八哥"

exBird.singSong()

print(exBird.birdColor)

//MARK:----------------------协议相关---------------------

//协议的语法

protocol Bark {

  //协议中可以定义属性
  var name: String {get set}
  //协议中也可以定义方法
  func barking ()

}

//如果某个类既有父类又要遵守协议,语法为

//class A: 父类,协议1,协议2... {

//}

<pre><code>

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • “是不是一个人太久了总觉得时间在翻倍的过,我不知道自己在找什么只觉得丢了很多”一首充满回忆的歌曲,张卫所写写...
    喜歡夜的貓阅读 222评论 0 1
  • 记忆是一种美感,全新的东西就少掉了记忆的深情,没有深厚的感情在其中。 有时会在网上看到一些人的评论,说是总是回顾过...
    飞鸟逐溪阅读 198评论 0 0