首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift基础 协议

翻译自:https://docs.swift.org/swift-book/LanguageGuide/Protocols.html 协议定义了适合特定任务或功能方法、属性和其他要求蓝图。...允许变量参数,但须遵守与正常方法相同规则。然而,无法为协议定义方法参数指定默认值。 与类型属性要求一样,当在协议定义static关键字总是类型方法要求前加上静态关键字。...只有特定条件下,例如类型通用参数符合协议,通用类型才能满足协议要求。...编写试图采用SomeClassOnlyProtocol结构或枚举定义是一个编译错误。 注意 协议要求定义行为假设或要求符合类型具有参考语义而不是值语义,请使用协议。...textualDescription ​ } } 为协议扩展添加约束 定义协议扩展,您可以指定符合要求类型扩展方法和属性可用之前必须满足约束。

11600

Swift基础 访问控制

这些详细信息整个文件中使用时,使用文件专用访问来隐藏特定功能实现细节。 私人访问将实体使用限制为封闭声明,以及同一文件该声明扩展名。...单目标应用程序访问级别 编写一个简单单目标应用程序时,应用程序代码通常在应用程序独立,不需要在应用程序模块之外提供。内部默认访问级别已经符合此要求。因此,您不需要指定自定义访问级别。...只有当希望实体成为框架API一部分时,需要将其标记为开放或公共实体。 单元测试目标的访问级别 编写具有单元测试目标的应用程序时,应用程序代码需要提供给该模块才能进行测试。...协议 如果您想为协议类型分配显式访问级别,请在定义协议这样做。这使您能够创建只能在特定访问上下文中采用协议协议定义每个需求访问级别会自动设置为与协议相同访问级别。...编写或扩展类型以符合协议必须确保该类型对每个协议要求实现至少与该类型对该协议一致性具有相同访问级别。例如,如果公共类型符合内部协议,则该类型对每个协议要求实现必须至少是内部

12400
您找到你想要的搜索结果了吗?
是的
没有找到

Swift 泛型之条件性符合协议

Swift 泛型条件性符合(Conditional conformances) 表示泛型类型只有在其类型参数满足某些要求符合特定协议概念。...构建泛型适配器类型,条件性符合尤其强大,泛型适配器类型旨在反映其类型参数功能。...swift3,唯一建模方法是使用不同类型。...有了条件性符合,就可以提供一个泛型包装器类型,它基本需求满足最小公分母(例如,Sequence),但是它可以用类型参数来扩展它们功能(例如,类型参数符合Collection,LazySequence...现在,Swift 4.1 以上,我们可以使得它包含符合ScoreConvertible 协议 Element ,我们使Array符合ScoreConvertible协议,就像这样: extension

1.4K30

Swift基础 集合类型

这样做使更容易对代码进行推理,并使Swift编译器能够优化创建集合性能。 数组(Arrays) 数组将相同类型值存储在有序列表。相同值可以不同位置多次出现在数组。...您还可以将数组类型以速记形式写为[Element]虽然这两种形式功能上相同,但速记形式是首选,并在参考数组类型整个指南中使用。...Sets 集合在集合存储相同类型不同值,没有定义顺序。项目顺序不重要,或者需要确保项目只出现一次,您可以使用集合而不是数组。...需要根据它们标识符查找值,您可以使用字典,就像使用现实世界字典来查找特定单词定义一样。...您还可以以速记形式将字典类型写为[Key:Value]虽然这两种形式功能上相同,但简写形式是首选,并在参考词典类型整个指南中使用。

8800

Swift 3.1 新变化「译」

将项目迁移到Swift 3.0,新功能将不会破坏代码。不过,苹果已经Xcode 8.3支持Swift 2.3。所以如果你还没有从Swift 2.3迁移,现在是时候这样做了!...我建议尝试Playground上验证新功能,以便更好地了解所有更改内容。 Note:如果你想了解 swift 3.0 功能,可以看这篇文章。...协议而在你使用StringProvider扩展可选 wrapped 类型,添加isBlank方法。...return Int(number) } #endif 然而,使用Swift标准库,这种方法有一个主要缺点。...它需要为每个受支持旧语言版本编译标准库。这是因为以向后兼容模式运行Swift编译器,例如您要使用Swift 3.0行为,则需要使用针对该特定兼容性版本编译标准库版本。

1.7K20

Swift 3.1新改动

将项目迁移到Swift 3.0,新功能将不会破坏代码。不过,苹果已经Xcode 8.3支持Swift 2.3。所以如果你还没有从Swift 2.3迁移,现在是时候这样做了!...我建议尝试Playground上验证新功能,以便更好地了解所有更改内容。 Note:如果你想了解 swift 3.0 功能,可以看这篇文章。...协议而在你使用StringProvider扩展可选 wrapped 类型,添加isBlank方法。...return Int(number) } #endif 然而,使用Swift标准库,这种方法有一个主要缺点。...它需要为每个受支持旧语言版本编译标准库。这是因为以向后兼容模式运行Swift编译器,例如您要使用Swift 3.0行为,则需要使用针对该特定兼容性版本编译标准库版本。

2.5K50

Swift基础 通用

您可以创建一个包含Int值数组,或包含String值数组,或者为可以Swift创建任何其他类型数组。同样,您可以创建一个字典来存储任何指定类型值,并且该类型没有限制。...您可以通过角度括号内写入要存储堆栈类型创建一个Stack实例。...您可以创建自定义泛型类型定义自己类型约束,这些约束提供了泛型编程大部分功能。像Hashable抽象概念根据概念特征而不是具体类型来描述类型。...定义协议,声明一个或多个关联类型作为协议定义一部分有时是有用。...上下文,其中条款 已经泛型类型上下文中工作,您可以编写一个泛型where子句,作为声明一部分,该声明没有自己泛型类型约束。例如,您可以泛型类型下标或泛型类型扩展方法上编写泛型子句。

8700

Swift基础 类型铸造

定义类型铸造类层次结构 您可以使用带有类和子类层次结构类型转换来检查特定类实例类型,并将该实例转换为同一层次结构一个类。...但是,如果迭代此数组内容,则收到项目被键入为MediaItem,而不是Movie或Song。为了将他们作为他们原生类型需要检查他们类型,或将他们降为其他类型,如下所述。...尝试将类型转换为子类类型类型转换运算符形式返回一个可选值。item结果as?Movie类型为Movie?,或“可选Movie”。 当应用于库数组Song实例,将向下转换到Movie失败。...明确需要它们提供行为和功能使用Any和AnyObject。最好具体说明希望代码中使用类型。 以下是使用Any处理不同类型组合示例,包括函数类型和非类类型。...Ivan Reitman // Hello, Michael 注意 Any类型表示任何类型值,包括可选类型。如果使用可选值,其中需要Any类型值,Swift会向发出警告。

6800

SwiftShot:为增强现实创建游戏

开始自己会话,启动会话玩家会创建一个ARWorldMap包含ARKit对游戏板周围区域空间理解。加入会话其他玩家会收到地图副本,并查看主持人查看该表照片。...枚举可以包含特定于每个游戏动作附加信息(如弹弓抓取状态或球发射速度)作为每个枚举案例相关值,这意味着您不需要在别处编写代码来确定哪些信息是相关为哪个行动。...通过Codable在这些枚举类型上实现Swift 协议,可以轻松地序列化和反序列化操作,以便通过本地网络进行传输。...为了使用这种紧凑位打包对结构进行编码和解码,SwiftShot定义了一种BitStreamCodable协议,扩展了Swift Codable协议模式,并提供了一种将位流编码类型与Codable同一数据流其他...Swift 类型相结合方法。

1.7K30

使用Codable归档Swift对象

UserDefaults非常适合存储简单设置,例如整数和布尔值,但是涉及复杂数据——例如自定义Swift类型——我们需要做更多工作。...使用这样数据Swift为我们提供了一个很棒协议,称为Codable:一种专门用于存档和取消存档数据协议,这是一种“将对象转换为纯文本然后再次转换”奇特方式。...我们将在未来项目中更多地研究Codable,但是目前我们需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults,然后在从UserDefaults返回将其取消存档。...使用具有简单属性类型(字符串,整数,布尔值,字符串数组等),支持归档和取消归档唯一需要就是向Codable添加一致性,如下所示: struct User: Codable { var...该名称暗示它特定于JavaScript,但实际上,我们都使用它,因为它是如此快速和简单。 Codable协议需要我们使用JSON,实际上可以使用其他格式,但这是迄今为止最常见格式。

2K30

苹果将为 Apple Watch X 铺路 | Swift 周报 issue 45

满足条件使用带有breakrepeat-while循环,可读性、安全性和清晰度之间提供平衡。 承认解决这个问题类似于停止问题,并且编译器通常很难进行此类分析。...4) 讨论接受 Type 并返回该 Type 实例通用函数 问题 该问题是由于尝试 Swift 协议函数中使用类型参数根据条件返回特定类型实例 (shadowFilter) 而引起。...协议 ObjectRequestable 有一个方法 getObject(type: T.Type) -> T? 旨在返回特定类型实例(如果在一致类可用)。...编译器还会标记 ShadowFilter.self 表达式模式与泛型类型之间不匹配。 T 型。 这里挑战在于尝试协议函数内有条件地返回特定类型实例,而不需要直接类型转换。...获取 FooBar 实例上属性 baz ,它将 self 转换为 Bar,然后获取其 baz 属性。

11410

Swift基础 枚举

如果熟悉C,您将知道C枚举为一组整数值分配相关名称。Swift 枚举要灵活得多,不必为每个枚举案例提供值。...Swift 枚举本身就是一流类型。它们采用了许多传统上由类支持功能,例如计算属性以提供有关枚举当前值更多信息,以及实例方法,以提供与枚举所代表相关功能。...通过枚举名称后写入:CaseIterable来启用此功能Swift将所有案例集合公开为枚举类型allCases属性。...首次代码定义枚举,原始值设置为预填充值,如上面的三个ASCII代码。特定枚举情况原始值始终相同。根据枚举一个情况创建新常量或变量,会设置关联值,并且每次这样做都可能不同。...隐式分配原始值 处理存储整数或字符串原始值枚举,您不必为每个案例显式分配原始值。您不这样做Swift会自动为分配值。

6300

架构之路 (七) —— iOS AppSOLID原则(一)

这意味着应该能够扩展类型功能,而无需大幅更改它们以添加需要内容。 3. Liskov Substitution 程序对象应该可以用它们类型实例替换,而不会改变该程序正确性。...设计将在代码不同位置使用协议,最好将该协议分解为多个较小部分,每个部分都有特定作用。这样,客户端只依赖于他们需要协议部分。 5....代码不同部分不应依赖于具体类。他们不需要了解这些。这鼓励使用协议而不是使用具体类来连接应用程序各个部分。 注意:重构现有项目,按顺序遵循 SOLID 原则并不重要。...Creating the Enum 项目导航器创建一个名为 Enums 新组。在其中创建一个名为 ReportRange.swift新文件。...拥有这样特定协议将使将来更改功能变得容易,并使测试这些新功能变得更加容易。当你有少量代码,最好现在就这样做,而不是等到项目变得太大而变棘手。

4.7K10

Swift 周报 第十期

下载 Xcode 14 Beta 版[4] 提案 通过提案 SE-0352: 隐式开放存在类型[5] 状态:Swift 5.7 已实现Swift 存在类型允许存储一个特定类型为未知值,且可能在运行时更改...被存储值动态类型,我们称为存在类型底层类型由它遵循协议集以及潜在超类知道。尽管存在类型对于表达动态类型值非常有用,但由于它们动态性质,它们受到一定限制。...第二次审查重点是关注向前兼容性,一个调用唤起一个隐式开放存在类型,必须被抹除类型以防止存在动态类型内存泄漏到返回值。...存在类型表达能力增加,我们可能会有能力使用一个更具体类型作为这一个调用返回类型,这可能造成源中断。...与泛型一样,它们使函数能够获取和返回多种可能类型。与泛型参数类型不同,存在类型作为输入传递给函数需要预先知道。此外,从函数返回,可以删除具体类型(隐藏在协议接口后面)。

2.1K00

Swift 5.6到5.10新特性整理

使用原始 withTaskGroup() API ,可能会出现一个问题,因为 Swift我们调用 next() 或遍历任务组子任务丢弃子任务及其结果数据。...Type SE-0309 极大地放宽了 Swift 协议具有 Self 或关联类型要求禁止使用协议作为类型限制,转向一个基于它们所做特定属性或方法受限模型。...Self 要求协议,这意味着它提供了引用采用它特定类型功能。...:创建缓存,我们显然可以直接创建一个特定缓存,如下所示: func loadDefaultCache() -> LocalFileCache { LocalFileCache(items:...将这些称为存在类型正在使用实际数据类型位于一个盒子内,当我们该盒子上调用方法Swift 理解它应该隐式地盒子内数据上调用方法。

1.4K10

Swift 周报 第三十三期

它们是用于访问特定语言功能符号,这些功能会生成与命名属性相关内容,而不是正常访问该属性。...Swift 在前缀运算符位置中使用 \ 来创建“关键路径”,该对象通常表示(本例)Graphic.children 属性,而不是特定 Graphic Children 属性;该对象可以应用于 Graphic...该功能演变提案实际上讨论了几种不同语法,并解释了为什么选择反斜杠[4]。 前缀意味着正在访问相关属性属性包装器提供特殊功能。...这是阻止我们 Swift 完全完成对移动 C++ 类型支持一个关键问题,因为我们需要形成像 UnsafePointer 这样没有语言限制类型。...此外,以下语言功能将有助于改善 Swift 对 C++ 类型执行一些常见操作的人体工程学: 能够 Swift 序列上执行借用 for 循环,这确实需要经过 IteratorProtocol,但可以使用索引迭代

31420

Swift: 有用标准库全局函数

全局函数 Global functions :无需特定类型范围就可以从任何地方访问函数是一个古老概念, C 和 Objective-C 等语言中很流行,但是 Swift 不建议使用,因为我们希望对它们进行很好类型化和范围划分...global function 由于历史原因,Swift 标准库仍然具有相当多公共全局功能,其中一些功能至今仍然非常有用。让我们看一下zip()和dump()之类函数。...如果需要同时迭代两件事,这将非常有用,因为如果没有zip,则必须手动构建一个for循环并分别访问每个数组每个索引。使用zip可以使以更实用for-in方式访问所有数组元素。...) 同样非常流行是,将stride()函数添加到Swift,作为一种创建可以跳过某些元素循环方法,因为从swift 语言中删除了等效 C 样式方法: for (int i = 0; i < 10...本文未在本节单独提及,因为如果需要交换数组元素,则使用正确方法是Array.swapAt()。但是,需要创建伪“aux”属性来保存值其他情况下,仍然可以使用swap()。

2.7K20

Swift基础 控制流程

在上面的示例,index是一个常量,其值循环每次迭代开始自动设置。因此,index使用之前不必声明。它通过包含在循环声明来隐式声明,而无需let声明关键字。...但是,您可以使用此语法迭代任何集合,包括自己类和集合类型,只要这些类型符合Sequence协议。 While循环 while循环执行一组语句,直到条件变成false。...第一次迭代开始前不知道迭代次数,最好使用这些类型循环。Swift提供了两种类型while循环: while每次通过循环开始时评估其状态。...如果玩家正方形25上移动或超过25,循环条件将计算为false,游戏结束。 在这种情况下,while循环是合适,因为while循环开始游戏长度不明确。相反,循环被执行,直到满足特定条件。...条件声明 根据特定条件执行不同代码通常非常有用。您可能希望发生错误时运行额外代码,或者值变得太高或太低显示消息。为此,您可以将部分代码附加条件。

9400

Swift基础 基础知识

这些被称为常数,比C常数强大得多。整个 Swift ,常量会使用,使代码处理不需要更改更加安全、更清晰。...使用变量来存储需要能够更改值。 类型注释 您可以声明常量或变量提供类型注释,以明确常量或变量可以存储类型。...注意 特别需要与平台原生单词大小相同无符号整数类型使用UInt。如果不是这样,最好是Int,即使已知要存储值是非负值。...由于类型推断,Swift需要类型声明比C或Objective-C等语言少得多。常量和变量仍然是显式类型,但指定其类型大部分工作都是为完成声明具有初始值常量或变量类型推断特别有用。...Objective-C,’ nil ‘是一个指向不存在对象指针。Swift,’ nil ‘不是一个指针——它是一个特定类型缺失。

11700

使用 Codable 归档 Swift 对象

UserDefaults非常适合存储简单设置,例如整数和布尔值,但是涉及复杂数据——例如自定义Swift类型——我们需要做更多工作。...使用这样数据Swift为我们提供了一个很棒协议,称为Codable:一种专门用于存档和取消存档数据协议,这是一种“将对象转换为纯文本然后再次转换”奇特方式。...我们将在未来项目中更多地研究Codable,但是目前我们需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults,然后在从UserDefaults返回将其取消存档。...使用具有简单属性类型(字符串,整数,布尔值,字符串数组等),支持归档和取消归档唯一需要就是向Codable添加一致性,如下所示: struct User: Codable { var...该名称暗示它特定于JavaScript,但实际上,我们都使用它,因为它是如此快速和简单。 Codable协议需要我们使用JSON,实际上可以使用其他格式,但这是迄今为止最常见格式。

1.2K20
领券