上一篇文章与大家分享了一些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>