//
// Protocols.swift
// SwiftCode
//
// Created by Alisa on 2022/4/14.
// Copyright ? 2022 Alisa. All rights reserved.
//
import Foundation
/*
协议:在语法上,协议中可以定义一些属性和方法,这些属性和方法只是声明,协议中并不能实现这些属性和方法。协议不是一种数据类型,没有
构造方法,也不需要实例化
swift中,协议使用protocol关键字创建,其中可以声明属性与方法,其中属性在具体实现时可以是计算属性,也可以是存储属性
协议与扩展的联用:
扩展可以为数据类型添加新的功能,通过扩展也可以为协议中约定的属性方法提供默认的实现。
开发者可以为某个协议提供一个扩展,在扩展中为其约定的属性方法提供一套默认的实现,这样所有遵守此协议的数据类型都获取到了扩展中的默认实现
*/
protocol BookMarkProtocol{
/* ** 定义属性 */
//只读
var bookColor:String { get }
//可读可写
var bookPages:Int {get set}
//静态属性
static var bookSize:(Int, Int){get set}
/* ** 定义方法 */
//实例方法
func markLiteraryBooks()->Void
//静态方法
static func cleanBookMark()->Void
}
class Bookmark{
var bookName:String
var Bentence:String
var color:String
var pages:Int
static var size:(Int, Int) = (20, 20)
//协议属性
//只读
var bookColor:String{
get{
return self.color
}
}
//可读可写
var bookPages:Int{
get{
print("协议的实例计算属性,读取book的pages:\(self.pages)")
return self.pages
}
set{
print("协议的实例计算属性,设置book的pages:\(newValue)")
self.pages = newValue
}
}
//静态属性
static var bookSize:(Int, Int){
get{
print("协议的静态计算属性,读取book的size:\(self.size)")
return self.size
}
set{
print("协议的静态计算属性,设置book的size:\(newValue)")
self.size = newValue
}
}
//协议方法
//实例方法
func markLiteraryBooks(){
print("放入文学类书籍中的 book mark")
}
//静态方法
static func cleanBookMark(){
print("清理一下当前的 book mark")
}
init() {
self.bookName = ""
self.Bentence = ""
//协议添加的属性
self.color = ""
self.pages = 0
}
deinit{
print("Bookmark deinit")
}
}
//协议与扩展的结合使用
@objc protocol ClassProcotol:AnyObject{
//此协议方法可选择是否实现,即遵守协议的类可以实现,也可以不实现
@objc optional func log()
}
//为ClassProtocol中的方法提供默认实现
extension ClassProcotol{
func log(){
print("show this log")
}
}
class AirConditioner:ClassProcotol{
//接受这个协议时,报了一个警告:Non-'@objc' method 'log()' does not satisfy optional requirement of '@objc' protocol 'ClassProcotol'
}
class Protocols{
//使用协议中的实例属性与实例方法
func useInstanceProtocols(){
let mark = Bookmark()
//设置协议中计算属性
mark.bookPages = 22
//设置属性
mark.color = "blue"
//读取协议中的计算属性
let color = mark.bookColor
let pages = mark.bookPages
print("当前书籍的颜色:\(color), 当前书籍的页码数:\(pages)")
//协议中的实例方法
mark.markLiteraryBooks()
/* 打印信息:
协议的实例计算属性,设置book的pages:22
协议的实例计算属性,读取book的pages:22
当前书籍的颜色:blue, 当前书籍的页码数:22
放入文学类书籍中的 book mark
Bookmark deinit
*/
}
//使用协议中的静态属性与静态方法
func useStaticProtocols(){
//协议中的静态属性
let size = Bookmark.bookSize
print("size的标准尺寸:\(size)")
//协议中的静态方法
Bookmark.cleanBookMark()
/* 打印信息
size的标准尺寸:(20, 20)
清理一下当前的 book mark
*/
}
//协议与扩展的结合使用
func useExtensionProtocols(){
let acd = AirConditioner()
acd.log() //show this log
}
}
|