Swift学习笔记三

news/2024/7/3 8:37:22 标签: swift, 移动开发

协议和扩展

在Objective-C中,协议是很常见也非常重要的一个特性,Swift中也保留了协议,语法略有变化。

用protocol关键字声明一个协议:

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

类、结构、枚举型都可以遵守协议:

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

注意在结构体的方法先用mutating关键字来标识该方法会改变结构体,而类声明中不需要给任何方法加此关键字,因为类的任何方法都可以改变类。

用extension给现有的类型增加功能,比如新的方法或者计算过的属性等。

也可以通过extension来给一个类型添加对某个协议的遵守,这个类型可以是在别的地方声明的,甚至是从第三方库或框架导入的。

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

协议的名字可以像其他具名的类型名字一样被使用,比如创建一个包含很多对象的集合,这些对象都是不同的类型,但是它们都遵守同一个协议。当处理那些类型为某个协议的变量时,协议之外声明和定义的方法将无法调用。

let protocolValue: ExampleProtocol = a
println(protocolValue.simpleDescription)
println(protocolValue.anotherProperty)  // Uncomment to see the error

尽管protocolValue变量的运行时类型是SimpleClass,编译器仍然会将它看做显示指定的ExampleProtocol类型,这意味着你不能调用那些在SimpleClass中除了遵守ExampleProtocol协议之外定义的其他方法。

泛型(Generics)

用尖括号包含一个名字来创建一个泛型函数或者类型

func repeat<Item>(item: Item, times: Int) -> [Item] {
    var result = [Item]()
    for i in 0..<times {
        result.append(item)
    }
    return result
}
repeat("knock", 4)

可以创建泛型格式的函数、方法、类、枚举类型、结构体。

enum OptionalValue<T> {
    case None
    case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)

在类型名之后用where来指明一系列要求,比如要求某个数据类型来实现某个协议,要求两个类型必须相同,或者要求某个类必须拥有指定的基类

func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}
anyCommonElements([1, 2, 3], [3]) //true

简单的情况下,可以省略where而直接在冒号后面写协议或者类名,<T:Equatable>和<T where T:Equtable>是等价的。

转载于:https://www.cnblogs.com/dson/p/4552090.html


http://www.niftyadmin.cn/n/1384879.html

相关文章

已知收敛域求收敛区间_枫香精油 Liquidambar消除皮炎和收敛粘液

戳蓝字“植物精油ABC”关注我们哦&#xff0c;每天8:30更新。支持最短中文简体关键词查询精油种类和用法&#xff0c;目前已包括且不限于&#xff1a;187种植物精油疗法配方、63种单方精油、36种复方精油。★以下内容由植物精油ABC首发&#xff0c;感谢其他精油公众号对本工作号…

笨办法学 Python(第三版)习题 14: 提示和传递

参考书籍 代码 以上代码为python2语法&#xff0c;目前最新是python3语法&#xff0c;请使用python3语法进行学习 加分习题 常见问题回答

笨办法学 Python(第三版)习题 15: 读取文件

参考书籍 代码 以上代码为python2语法&#xff0c;目前最新是python3语法&#xff0c;请使用python3语法进行学习 加分习题 常见问题回答

Python socket programming tutorial

2019独角兽企业重金招聘Python工程师标准>>> 转自 http://www.binarytides.com/python-socket-programming-tutorial/ This is a quick guide/tutorial to learning socket programming in python. Socket programming python is very similar to C. Socket functio…

excel制作一个信息录入系统_用Excel制作简单的进销存系统

最近刚好帮一个朋友做一个进销存系统&#xff0c;因为使用者对电脑操作以及Excel应用能力较弱&#xff0c;我做的进销存系统没有用特别复杂的功能&#xff0c;非常有解决意义&#xff0c;我将手把手将你制作一个简单的进销存系统。需求描述朋友找人合伙开了一个女装店&#xff…

如何区分路由器和交换机

有用户在给我提问&#xff0c;问我路由器和交换机分别是什么&#xff1f;在大部分人眼中&#xff0c;他们就是一个黑盒子&#xff0c;都摆在机架式上&#xff0c;样子又出奇的相似。所以自然分不清楚&#xff0c;他们一般是这样的出现我们面前的&#xff01;远看一样近看也差不…

029 UTF-8与utf8的区别

转自&#xff1a;http://blog.sina.com.cn/s/blog_169a2d3bc0102x4p0.html 以前在码代码的时候确实也遇到过弄混UTF-8和utf8的情况&#xff0c;一直没去深究&#xff0c;今天偶然看到&#xff0c;转过来学习下。在使用中常常遇到 utf-8 和 utf8&#xff0c;现在终于弄明白他们的…

聚焦 SQL 数据库活动异地复制

Tobias Ternstrom US-DS-PM 首席部门项目经理 本文作为一系列业务连续性和灾难恢复文章的开篇&#xff0c;概述了业务连续性的各种场景&#xff0c;然后重点介绍 SQL 数据库高级服务级别提供的活动异地复制的用法。有关活动异地复制的详细信息&#xff0c;请观看生动而详实的C…