Swift语言学习---------高级
一.结构体.
示例代码:
//*****************结构体(Struct)***************
//1.声明一个结构体
struct rect{
//声明结构体变量成员的属性(存储属性)
var x:Float
var y:Float
var With:Float
var Height:Float
//声明结构体属性
//注意:需要使用Static关键字修饰
static var description:String?
//计算属性(本身不存值,专门用于计算其他属性的值)
var centerX :Float{
//setter方法
set{
x = newValue
}
//getter方法
get{
return x + With/2
}
}
var centerY :Float{
get{
return y;
}
}
//声明方法
//声明一个结构体对象(结构体变量)方法[类似于类中的实例(对象)方法]
func info(){
print("x:\(x) y:\(y) width:\(With) height:\(Height)")
}
//声明结构体方法[类似于类中的类的方法]
static func info1(){
print("这是一个结构体方法")
}
}
//1.根据结构体类型创建结构体对象(结构体变量)
var rect1 = rect(x: 0, y: 0, With: 100, Height: 100)
//注意:如果结构体对象是常量内部的属性是不允许修改的
//访问结构体对象的属性
rect1.x = 20
print(rect1.x)
//访问结构体属相
rect.description = "我是结构体属性"
print(rect.description!)
//访问结构体对象的计算属性
rect1.centerX = 100 //在调用center中的setter方法
let value = rect1.centerX //在使用centerx的getter方法
//使用结构体对象方法
rect1.info()
//使用结构体方法
rect.info1()
二.类及继承
示例代码:
//类*****************************************
//class Person{
// var name:String?
// var age:Int?
// //构造方法
// init(name:String, age:Int){
// self.name = name
// self.age = age
// }
//}
//
////创建一个Person对象
//var p1:Person = Person(name: "张三 ", age: 20)
//
////访问类中的属性
//print(p1.name!)
//print(p1.age!)
class Person {
//声明属性
var name:String?
var age:Int?
//声明类属性
static var introduce:String! //(存储属性)
//声明计算属性(类,结构体,枚举)
var number:Int{
get{
return self.age!
}
set(value){ //这种写法表示在调用number的set方法时传过来的参数赋值给value
age = value //注意切记setter/getter方法中不能使用self.的形式
}
}
//声明类方法 static修饰时,不能被子类重写 class修饰的可以
static func sayHi(){
print(introduce)
//注意在类方法中不能使用对系那个属性,只能使用类属性
}
class func sayHi2(){
}
//声明构造方法
init(name:String,age:Int){
self.name = name
self.age = age
}
init(name:String){
self.name = name
}
//声明一个对象方法
func sayHello(){
print("我是对象方法")
}
}
//继承
class Student:Person {
//重写父类的类方法
override class func sayHi2(){
print("我是Student类,重写了父类的类方法")
}
}
//
let person = Person (name: "李四", age: 25)
person.sayHello() //使用对象方法
Person.sayHi2() //使用的是类方法
Student.sayHi2() //使用的Student中重写父类的那个方法
//创建Student对象
let student:Student = Student(name: "小碗", age: 21)
//值类型与引用类型***************************************
//值类型变量
//struct animal {
//
// var name:String?
// var age:Int?
//
//
//}
//var dog = animal(name: "小明", age: 2)
//var dog1 = dog //此时dog1是从dog拷贝过来的值,是一份新值
//dog.name = "小花"
//print("\(dog.name!),\(dog1.name!)")
//引用类型变量
class animal {
var name:String?
var age:Int?
init(name:String , age:Int){
self.name = name
self.age = age
}
}
var dog = animal(name: "小黄", age: 3)
var dog1 = dog //此时dog1是从dog拷贝过来的值,是一份新值
dog.name = "小花"
print("\(dog.name!),\(dog1.name!)")
三.协议及扩展.
示例代码:
//协议(protocol)***************************************
//当协议前有可选方法时,该协议前要用关键字@objec修饰,可选实现方法用optional修饰
@objc protocol MerrayDelegate{
func cook() //做饭
func wach() //洗衣服
optional func hitDoudou() //打豆豆
}
protocol DividDelegate{
func lookAfterChild()
}
class Man: Person,MerrayDelegate,DividDelegate {
@objc func cook() {
print("还好学了几年手艺")
}
@objc func wach() {
print("手洗")
}
func lookAfterChild() {
print("看小孩")
}
}
//扩展 (实现代码的分离,不过与臃肿)
extension Man{
@objc func hitDoudou() {
print("打豆豆")
}
}
//
let man:Man = Man(name: "黄海波", age: 40)
man.cook()
man.hitDoudou()
//扩展(extension)**************************************************
//1.扩展一个类遵循的协议的方法的实现
//扩展 (实现代码的分离,不过与臃肿)
//extension Man{
// @objc func hitDoudou() {
// print("打豆豆")
// }
//
//}
//2.扩展一个类的方法(类似于oc中的category类目)
extension Man {
//扩展一个对象方法
func sing(){
print("哈哈")
}
//扩展一个类方法
class func eat() {
print("吃饭")
}
}
man.sing()
Man.eat()
四.闭包
闭包类似于于block函数 ]
注意:闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,
闭包函数体即将开始。
示例代码:
//闭包 相当于block函数
//求两个整型数中的最大值
//第一种方式实现闭包
var maxResult:((a:Int, b:Int) ->Int) = {
//这个函数的类型是(a:Int, b:Int) ->Int
(a:Int,b:Int)->Int in
return a > b ? a : b
}
print(maxResult(a: 3, b: 5))
//第二种方式
maxResult = {
a,b in
return a > b ? a : b
}
//第三种方式
maxResult = {
a,b in
a > b ? a : b
}
//第四种
maxResult = {
$0 > $1 ? $0:$1
}
//第五种
maxResult = {
(a,b) -> Int in
a > b ? a : b
}
print(maxResult(a: 3, b: 5))