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

Swift 4-不能在协议中使用公共修饰符

在Swift 4中,协议中不能使用公共修饰符。公共修饰符(public)用于指定实体(类、结构体、枚举、协议等)对外可见的访问级别。然而,在协议中使用公共修饰符是不允许的。

协议是一种用于定义方法、属性和其他功能的蓝图或模板。它们用于描述类、结构体或枚举应该具有的特定功能。在Swift中,协议可以被类、结构体和枚举遵循,以实现协议中定义的要求。

在协议中,可以定义方法、属性、下标和关联类型等。这些要求可以被遵循协议的类型实现,以满足协议的约束。然而,协议本身不能使用公共修饰符来指定对外可见的访问级别。

相反,遵循协议的类型可以使用公共修饰符来指定实现的方法、属性或下标的访问级别。这样,当其他模块引用该类型时,可以根据访问级别的规则来确定是否可以访问这些实现。

总结起来,Swift 4中的协议不能使用公共修饰符,但遵循协议的类型可以使用公共修饰符来指定实现的访问级别。这样可以确保协议的定义不会直接暴露给外部模块,而只有遵循协议的类型的实现才对外可见。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift基础 访问控制

如果函数的计算访问级别与上下文默认值匹配,则必须显式指定访问级别作为函数定义的一部分。 下面的示例定义了一个名为someFunction()的全局函数,但没有为函数本身提供特定的访问级修饰符。...协议 如果您想为协议类型分配显式访问级别,请在定义协议时这样做。这使您能够创建只能在特定访问上下文中采用的协议协议定义每个需求的访问级别会自动设置为与协议相同的访问级别。...例如,您可以定义一种公共类型,该类型可以在其他模块中使用,但其与内部协议的一致性只能在内部协议的定义模块中使用。 类型符合特定协议的上下文是类型访问级别和协议访问级别的最低值。...注意 在Swift,就像在Objective-C中一样,协议一致性是全局的——类型不可能在同一程序以两种不同的方式遵守协议。 扩展 您可以在类、结构或枚举可用的任何访问上下文中扩展类、结构或枚举。...如果您使用扩展来添加协议一致性,则无法为扩展提供显式访问级修饰符。相反,协议自己的访问级别用于为扩展的每个协议需求实现提供默认访问级别。

12600

【面试必备】Swift 面试题及其答案

Swift ,在函数和数据结构中都可以使用泛型,例如类、结构体和枚举。 泛型一般是用来解决代码复用的问题。...问题4- 哪些情况下你不得不使用隐式拆包?说明原因 ---- 答案:对 optional 变量使用隐式拆包最常见的原因如下: 1、对象属性在初始化的时候不能 nil,否则不能被初始化。...---- 1、泛型类 2、泛型结构体 3、泛型协议 答案: Swift 包含 1 和 2 特性。 泛型可以在类、结构体、枚举、全局函数或者方法中使用。 3 是通过 typealias 部分实现的。...问题4- static 或者 class 修饰符 ---- 声明一个静态属性或者函数,我们常常使用值类型的 static 修饰符。...答案:使用下面的初始化方法: 问题4- 描述一种在Swift中出现循环引用的情况 ---- 描述一种在 Swift 中出现循环引用的情况,并说明怎么解决。

6K30

Swift 派发机制

如 C 使用直接派发; Java 默认使用函数表派发,可以通过 final 修饰符修改成直接派发; C++ 默认使用直接派发,但可以通过加上 virtual 修饰符来改成函数表派发; OC 使用直接派发...根据 Swift 编译生成的 SIL 文件分析,Swift 存在两种函数表,其中协议使用的是 witness_table (SIL 文件名为 sil_witness_table),类使用的是 virtual_table...Swift 语言中的一些限制了: extension 定义的方法如果想 overrite,需要在方法上加上 @objc 修饰符;因为如果不加 @objc,走的是直接派发,无法重写方法。...下列情况编译器默认不会进行内联优化: 函数体过长(无形增加了包体积,重复代码); 函数包含动态派发; 函数包含递归调用; Swift 显式内联优化修饰符 @inline(never) 声明这个函数...编译器可以通过 whole module optimization 检查继承关系,对某些没有标记 final 的类通过计算,如果能在编译期确定执行的方法,则使用直接派发。

97920

开心档之Swift 访问控制

协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。 访问控制基于模块与源文件。 模块指的是以独立单元构建和发布的 Framework 或 Application。...在 Swift 的一个模块可以使用 import 关键字引入另外一个模块。 源文件是单个源码文件,它通常属于一个模块, 源文件可以包含多个类和函数 的定义。...internal 可以访问自己模块源文件里的任何实体,但是别人不能访问该模块源文件里的实体。 fileprivate 文件内私有,只能在当前源文件中使用。...private 只能在访问,离开了这个类或者结构体的作用域外面就无法访问。 public 为最高级访问级别,private 为最低级访问级别。...如果想为一个协议明确的申明访问级别,那么需要注意一点,就是你要确保该协议只在你申明的访问级别作用域中使用

86310

开心档之Swift 访问控制访问控制

协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。 访问控制基于模块与源文件。 模块指的是以独立单元构建和发布的 Framework 或 Application。...在 Swift 的一个模块可以使用 import 关键字引入另外一个模块。 源文件是单个源码文件,它通常属于一个模块, 源文件可以包含多个类和函数 的定义。...internal 可以访问自己模块源文件里的任何实体,但是别人不能访问该模块源文件里的实体。 fileprivate 文件内私有,只能在当前源文件中使用。...private 只能在访问,离开了这个类或者结构体的作用域外面就无法访问。 public 为最高级访问级别,private 为最低级访问级别。...如果想为一个协议明确的申明访问级别,那么需要注意一点,就是你要确保该协议只在你申明的访问级别作用域中使用

77910

开心档之Swift 访问控制

协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。访问控制基于模块与源文件。模块指的是以独立单元构建和发布的 Framework 或 Application。...在 Swift 的一个模块可以使用 import 关键字引入另外一个模块。源文件是单个源码文件,它通常属于一个模块, 源文件可以包含多个类和函数 的定义。...internal可以访问自己模块源文件里的任何实体,但是别人不能访问该模块源文件里的实体。fileprivate文件内私有,只能在当前源文件中使用。...private只能在访问,离开了这个类或者结构体的作用域外面就无法访问。public 为最高级访问级别,private 为最低级访问级别。...,那么需要注意一点,就是你要确保该协议只在你申明的访问级别作用域中使用

98520

Swift 周报 第四十一期

该提案定义了在产生数据竞争的情况下使用全局变量的选项。在此提案,全局变量涵盖任何静态持续时间的存储:在全局范围声明的 let 和存储 var,或者作为静态成员变量。...鉴于关于向一致使用存在的任何语言迁移的担忧,以及期望会出现可能影响该迁移最终结果的其他语言改进,语言指导组正在将 SE-0335 的源兼容更改推迟到将来的语言修订。...正如我们在关于 Swift 6 进展的最新帖子宣布的那样,我们已经使用即将推出的功能标志合并了一些兼容源代码的更改,计划在 Swift 6 默认启用这些标志。...找到了在 AnyReducer 中使用 Reducer 协议的方法,但找不到一种方法在 Reducer 协议内部使用 AnyReducer 或混合它们 有什么建议吗?...推荐博文 Swift 的崩溃回溯[9] 摘要: 这篇博客讨论了 Swift 5.9 版本中所包含的一些新的调试代码功能,一个能在实时检查崩溃的外部互动性极强的崩溃处理器,一个可以触发调试器进行即时调试的功能

20940

Swift vs. Kotlin 漫谈系列之类与继承

Kotlin: 因为在 Java 继承类和实现接口使用不同的关键字。 Swift: Swift 中继承类和实现协议也都是用同一个 : 符号。...Kotlin: Swift 如果实现多个接口,会不会有不同协议带来同名函数的冲突的问题。?...为了表示采用从哪个超类型继承的实现,我们使用由尖括号超类型名限定的 super,如 super。...Swift: Swift 没有内部类的概念。? Kotlin: ?你们没有抽象类,也没有内部类,不过你们的协议好像有很多玩法。下次听你给我好好讲讲你们的协议是怎么样的? Swift: ?...,fileprivate 限定只能在当前的源文件中使用 必要初始化器 必要初始化器(Required Initializers)使用 required 来修饰表明,如果子类继承父类都必须实现该初始化器

3.6K40

swift 访问控制(open、public、internal、fileprivate、private)

模块和源文件 Swift 的访问控制模型基于模块和源文件这两个概念。...但其他模块不可以被重写和继承,而在本模块内可以被重写和继承 Internal(默认访问级别,修饰符可写可不写) 所修饰的属性或方法在源代码所在的整个模块都可以访问。...如果你希望一个 public 级别的类型也能在其他模块中使用这种无参数的默认构造器,你只能自己提供一个 public 访问级别的无参数构造器 协议 如果想为一个协议明确地指定访问级别,在定义协议时指定即可...那么协议能在限制的访问级别内使用 协议继承,如果定义了一个继承自其他协议的新协议,那么新协议拥有的访问级别最高也只能和被继承协议的访问级别相同。...例如,你可以定义一个 public 级别的类,它可以在其他模块中使用,同时它也可以采纳一个 internal 级别的协议,但是只能在协议所在的模块作为符合该协议的类使用 分类 使用 extension

62710

Swift 的 Sendable 和 @Sendable 闭包

我应该在什么时候使用 Sendable? Sendable协议和闭包表明那些传递的值的公共API是否线程安全的向编译器传递了值。...当没有公共修改器、有内部锁定系统或修改器实现了与值类型一样的复制写入时,公共API可以安全地跨并发域使用。 标准库的许多类型已经支持了Sendable协议,消除了对许多类型添加一致性的要求。...} 然而,如果我们将协议要求添加到我们的泛型,我们将得到隐式支持: // Container 隐式地符合 Sendable,因为它的所有公共属性也是如此。...因此,编译器不能在源文件之外应用Sendable一致性,因为它对标题属性不可见,即使标题使用的是遵守Sendable协议的String类型。...由于我们给自己和同事增加了额外的责任,我鼓励使用这个属性,建议使用组合、最终类或值类型来实现我们的目的。 如何使用 @Sendabele 函数可以跨并发域传递,因此也需要可发送的一致性。

1.4K30

Sendable 和 @Sendable 闭包代码实例详解

使用 Sendable 应该在什么时候使用 Sendable? Sendable协议和闭包表明那些传递的值的公共API是否线程安全的向编译器传递了值。...当没有公共修改器、有内部锁定系统或修改器实现了与值类型一样的复制写入时,公共API可以安全地跨并发域使用。 标准库的许多类型已经支持了Sendable协议,消除了对许多类型添加一致性的要求。...} 然而,如果我们将协议要求添加到我们的泛型,我们将得到隐式支持: // Container 隐式地符合 Sendable,因为它的所有公共属性也是如此。...因此,编译器不能在源文件之外应用Sendable一致性,因为它对标题属性不可见,即使标题使用的是遵守Sendable协议的String类型。...由于我们给自己和同事增加了额外的责任,我鼓励使用这个属性,建议使用组合、最终类或值类型来实现我们的目的。 如何使用 @Sendabele 函数可以跨并发域传递,因此也需要可发送的一致性。

1.2K20

有效的只读属性

Swift 并发 异步调用不能出现在同步调用。这个基本限制意味着计算属性和下标将会被极度限制去使用 Swift 新的并发功能。...throws } subscript(_ day: Date) -> [Transaction] { get async } } 实现该协议的,实现 Account 协议的属性和下标时,可以提供与协议相同或者更少的效果关键字...协议一致性 上文提到过,为了让某个类型去遵循包含效果属性的协议,该类型必须实现效果属性或者下标,而且类型实现的属性或者下标修饰的效果词超过原协议。...此规则反映了如何对具有效果词修饰的函数进行一致性检查:协议具体实现可能会遗漏某个效果词,但是它不能展示协议没有指定的效果词。...大多的效果说明符只能在 getter 方法声明之前,也就是 C 位置,这更在结构体里的一个方法很相似。

1.8K60

iOS runtime swift swizzling

iOS runtime swift的Swizzling方法交换 背景知识 Swift 是一种强类型语言。即默认类型是安全的静态类型。...纯Swift类的函数调用已经不再是OC的运行时发送消息,而是类似于C++的vtable,在编译时就确定了调用哪个函数,所以没法通过runtime获取方法,属性。...Swift的动态性可以通过OC运行时来获得,动态性最常用的就是方法替换(Method Swizzling)。...swift动态修饰符 @objc 将Swift函数暴露给OC运行时,但是它仍然不能保证完全动态,编译器会尝试去对它做静态优化 dynamic 动态功能修饰符,它能保证函数,属性可以获得动态性 Swizzling...{ UIApplication.runOnce return super.next } } /// swizzling协议 在需要交换方法的类遵循此协议,实现方法

1.4K21

Swift开发规范

文件名如果有复数含义,文件名应使用复数形式,如一些工具类; 修饰规约 能用 let 修饰的时候,不要使用 var; 修饰符顺序按照 注解、访问限制、static、final 顺序; 尽可能利用访问限制修饰符控制类...如果不会,标记为 final,final 会缩短编译时间; 在编写库的时候需要注意修饰符的选用,遵循开闭原则; 格式规约 类、函数左大括号不另起一行,与名称之间留有空格 禁止使用无用分号 代码的空格出现地点...,在正常范围内可以看到完整代码 实现每个协议时, 在单独的 extension 里来实现 简略规约 Swift 会被结构体按照自身的成员自动生成一个非 public 的初始化方法,如果这个初始化方法刚好适合...形式处理异常,避免使用隐式解包 避免判断语句嵌套层次太深,使用 guard 提前返回 如果 for 循环在函数体只有一个 if 判断,使用 for where 进行替换 实现每个协议时, 尽量在单独的...我们通过配置文件可以控制启用或者关闭相应的规则,具体使用规则参照对应仓库的 REAMME.md 文件。 相关规范 Swift 官方 API 设计指南 Google 发布的 Swift 编码规范

1.5K10

Swift开发规范-修订版

k 前缀 + UpperCamelCase 命名;说明:本质上是推荐使用全局常量的,主要原因是会散落到代码各处,不方便管理。...上不用加任何修饰符修饰符加在 extension 内的变量或方法上;说明:目的是当修改extension某个方法的访问限制时,不需去考虑外部的extension访问限制,降低影响面。...【推荐】尽可能利用访问限制修饰符控制类、方法等的访问限制,遵循开闭原则;说明:如确定某方法或变量不应该被外部调用,就使用private进行修饰,编译程序阻止外部不合适的调用。...【推荐】在代码灵活的使用一些地标注释,如MARK、FIXME、TODO,当同一文件存在多种类型定义或者多种逻辑时,可以使用Mark进行分组注释,方便通过Xcode顶部面包屑进行切换; 代码示例: /...实现每个协议时,尽量在单独的 extension 里来实现; 【推荐】优先创建函数而不是自定义操作符; 【推荐】尽可能少的使用全局命名空间,如常量、变量、方法等; 【推荐】赋值数组、字典时每个元素分别占用一行时

1.7K50
领券