当前位置: 首页 > wzjs >正文

超级seo工具搜索网站排名优化策略

超级seo工具,搜索网站排名优化策略,岳阳关键词优化,清理空壳网站目录1、协议和扩展2、错误处理3、泛型1、协议和扩展 使用 protocol来声明一个协议。 protocol ExampleProtocol {var simpleDescription: String { get }mutating func adjust() }类、枚举和结构体都可以遵循协议。 class SimpleClass: ExampleProtocol {var simpleDescript…

目录

  • 1、协议和扩展
  • 2、错误处理
  • 3、泛型

1、协议和扩展

使用 protocol来声明一个协议。

protocol ExampleProtocol {var simpleDescription: String { get }mutating func adjust()
}

类、枚举和结构体都可以遵循协议。

class SimpleClass: ExampleProtocol {var simpleDescription: String = "A very simple class."var anotherProperty: Int = 69105func adjust() {simpleDescription += "  Now 100% adjusted."}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescriptionstruct SimpleStructure: ExampleProtocol {var simpleDescription: String = "A simple structure"mutatingfunc adjust() {simpleDescription += " (adjusted)"}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

练习: 给 ExampleProtocol增加一个要求。你需要怎么修改 SimpleClassSimpleStructure才能保证它们仍旧遵循这个协议?

注意在 SimpleStructure的声明中,使用了 mutating关键字来标记那些会修改结构体的方法。而 SimpleClass的声明中不需要将其方法标记为 mutating,因为类的方法总是可以修改类本身。

可以使用 extension为已有的类型添加新功能,比如新的方法和计算属性。扩展(extension)还可以为在其他地方声明的类型添加需要遵循的协议,包括那些从库或框架中导入的类型。

extension Int: ExampleProtocol {var simpleDescription: String {return "The number \(self)"}mutating func adjust() {self += 42}}
print(7.simpleDescription)
// 打印“The number 7”

练习: 给 Double类型写一个扩展,添加一个 absoluteValue属性。

你可以像使用其他命名类型一样使用协议名——例如,创建一个有不同类型但是都遵循同一个协议的对象集合。当你处理的是一个封装的协议类型时,协议外定义的方法不可用。

let protocolValue: any ExampleProtocol = a
print(protocolValue.simpleDescription)
// 打印“A very simple class.  Now 100% adjusted.”
// print(protocolValue.anotherProperty)  // 去掉注释可以看到错误

尽管变量 protocolValue的运行时类型是 SimpleClass,但编译器还是会将其视为 ExampleProtocol类型。这意味着你不能访问在协议之外的方法或者属性。

2、错误处理

你可以使用任何遵循 Error协议的类型来表示错误。

enum PrinterError: Error {case outOfPapercase noTonercase onFire
}

使用 throw来抛出错误,并使用 throws标记可能抛出错误的函数。如果在函数中抛出错误,函数会立即返回,并由调用该函数的代码来处理这个错误。

func send(job: Int, toPrinter printerName: String) throws -> String {if printerName == "Never Has Toner" {throw PrinterError.noToner}return "Job sent"
}

处理错误有多种方式,其中一种是使用 do-catch。在 do代码块中,你需要在可以抛出错误的代码前加上 try。在 catch代码块中,除非你另外命名,否则错误会被默认命名为 error

do {let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")print(printerResponse)
} catch {print(error)
}
// 打印“Job sent”

练习: 将 printer name 改为 "Never Has Toner",使 send(job:toPrinter:)函数抛出错误。

可以提供多个 catch块来处理特定的错误。和 switch 中 case的写法一样,在 catch后写匹配模式。

do {let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")print(printerResponse)
} catch PrinterError.onFire {print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {print("Printer error: \(printerError).")
} catch {print(error)
}
// 打印“Job sent”

练习: 在 do代码块中添加抛出错误的代码。你需要抛出哪种错误使其被第一个 catch块处理?对于第二个和第三个 catch块,又需要抛出哪种错误呢?

另一种处理错误的方式是使用 try?将结果转换为可选的。如果函数抛出错误,该错误会被抛弃并且结果为 nil。否则,结果会是一个包含函数返回值的可选值。

let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")

使用 defer代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出错误,这段代码都将执行。使用 defer可以把初始化代码和扫尾代码写在一起,即使它们在不同的时机执行。

var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]func fridgeContains(_ food: String) -> Bool {fridgeIsOpen = truedefer {fridgeIsOpen = false}let result = fridgeContent.contains(food)return result
}
if fridgeContains("banana") {print("Found a banana")
}
print(fridgeIsOpen)
// 打印“false”

3、泛型

在尖括号里写一个名字来创建一个泛型函数或者泛型类型。

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {var result: [Item] = []for _ in 0..<numberOfTimes {result.append(item)}return result
}
makeArray(repeating: "knock", numberOfTimes: 4)

你可以为函数和方法创建泛型,也可以为类、枚举和结构体创建泛型。

// 重新实现 Swift 标准库中的可选类型
enum OptionalValue<Wrapped> {case nonecase some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

在代码主体之前使用 where来指定对类型的一系列要求——例如,要求类型实现特定协议,要求两个类型是相同的,或者要求某个类具有特定的父类。

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> BoolwhereT.Element: Equatable, T.Element == U.Element
{for lhsItem in lhs {for rhsItem in rhs {if lhsItem == rhsItem {returntrue}}}returnfalse
}
anyCommonElements([1, 2, 3], [3])

练习: 修改 anyCommonElements(_:_:)函数,使其返回一个数组,该数组包含任意两个序列中共有的元素。

<T: Equatable><T> ... where T: Equatable的写法是等价的。


文章转载自:

http://hvAE6ILT.yrjxr.cn
http://xgdhcqhq.yrjxr.cn
http://WTO0TsQW.yrjxr.cn
http://Gsb6Tit1.yrjxr.cn
http://gTVCbz7E.yrjxr.cn
http://F8NbTO1x.yrjxr.cn
http://qphJypDR.yrjxr.cn
http://GdEroswS.yrjxr.cn
http://bn4P5E3a.yrjxr.cn
http://a23CC8W8.yrjxr.cn
http://xguROryC.yrjxr.cn
http://pAnTDgHc.yrjxr.cn
http://02IB4lNs.yrjxr.cn
http://f4lMVvtR.yrjxr.cn
http://a11Kqs1E.yrjxr.cn
http://ARKbCBjF.yrjxr.cn
http://Mf7TwuXw.yrjxr.cn
http://CYRE7N3Z.yrjxr.cn
http://iTAiu60Q.yrjxr.cn
http://o5jLnR78.yrjxr.cn
http://Cg2Mho5G.yrjxr.cn
http://NaLLpSOQ.yrjxr.cn
http://skcFQWE9.yrjxr.cn
http://u2vSWeIu.yrjxr.cn
http://ey0O5r21.yrjxr.cn
http://1tbCFN9O.yrjxr.cn
http://R7ISh5SD.yrjxr.cn
http://d3n8RJkQ.yrjxr.cn
http://454qd0a6.yrjxr.cn
http://mILl4T8I.yrjxr.cn
http://www.dtcms.com/wzjs/742930.html

相关文章:

  • 判断电脑和手机访问网站深圳工程建设交易服务中心网站
  • 手机号码网站开发百度怎么推广自己的产品
  • 网站的维护和更新网站建设需要的专业知识
  • 椒江建设网保障性阳光工程网站工作组赴沈阳爆炸现场
  • 成都旅游酒店推荐台州首页关键词优化
  • 坪山网站建设哪家效益快wordpress调用分类
  • 开一个做网站的公司赚钱吗云服务器有哪些
  • asp网站模板安装教程wordpress自动发外链
  • 办公室装修企业东莞优化公司首选3火星
  • 上海明鹏建设集团有限公司网站网站商务方案
  • 用vs2013做网站教程游戏开发者大会
  • 秦皇岛和平大街网站建设域名网站负责人的责任
  • 用织梦做企业网站wordpress exp
  • wordpress本地建站中国营销网站
  • 吴江微信网站制作查网站域名
  • 大连比较好的网站公司吗桐乡市建设局官方网站
  • 芒市网站建设公司百度广州给做网站公司
  • 山东省建设厅注册中心网站个人做外贸怎样起步
  • 手机销售培训网站网站建设外包公司招聘
  • iis怎么搭建设计网站互动网站建设
  • 移动端高端网站wordpress取消更改
  • 小狗做爰网站小学网站源码php
  • 南京哪家公司做网站顶尖的设计网站
  • 网站系统重要性宣传片拍摄手法
  • 网站统计分析天津魔方网站建设
  • 贵阳市城乡建设部网站中国建设银行网站个人网上银行
  • wordpress主题 食品整站优化seo
  • 网站备案和域名备案的区别新网站 蜘蛛
  • wordpress背景透明南通seo网站推广费用
  • 江门网站建设硬件设备网站不备案可以用吗