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

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

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

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

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

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

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

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

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

相关·内容

Swift基础 访问控制

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

14200

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

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

6.2K30
  • 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 的类通过计算,如果能在编译期确定执行的方法,则使用直接派发。

    1.1K20

    开心档之Swift 访问控制

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

    86810

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

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

    79310

    开心档之Swift 访问控制

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

    1K20

    Swift 周报 第四十一期

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

    22540

    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

    74210

    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.3K20

    如何在 SwiftUI 熟练使用 visualEffect 修饰符

    前言在 WWDC 23 ,SwiftUI 引入了一个名为 visualEffect 的新视图修饰符。此修饰符允许我们通过访问特定视图的布局信息来附加一组可动画化的视觉效果。...下面我们将学习如何在 SwiftUI 中使用新的 visualEffect 视图修饰符。介绍 visualEffect让我们从使用 visualEffect 视图修饰符的最简单示例开始。...在 SwiftUI 框架的先前版本,我们有视图修饰符,如缩放、偏移、模糊、对比度、饱和度、不透明度、旋转等。它们全部都是视觉效果,并且现在符合 VisualEffect 协议。...visualEffect 修饰符视觉效果visualEffect 视图修饰符是完成旧事物的新方法。我们可以使用旧视图修饰符修改视图的不透明度和偏移。如果你不需要布局信息,你可以继续使用它们。...visualEffect 视图修饰符支持可动画化的值。因此,你可以继续使用它根据视图在视图层次结构的框架和边界来动画化视图的视觉外观。

    11511

    有效的只读属性

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

    1.8K60

    苹果暂停高端 Vision 头戴设备研发| Swift 周报 issue 56

    而对于 internal、package 或无显式修饰符的成员,都需要使用全局搜索。 提议者认为,在大多数成员都是 package 可见性的情况下,显式的 package 修饰符可能成为视觉干扰。...推荐博文 swift 使用 swift-protobuf 协议通讯,使用指北 摘要: 文章全面介绍了如何在 Swift 利用 Swift-protobuf 进行高效的协议通信。...文章从定义仓库接口开始,使用 Swift协议(protocol)来描述数据操作方法,例如创建、删除和查找用户。...Swift的扩展:以及何时使用它们 摘要: 这篇文章介绍了如何使用 Swift 的扩展(Extensions),以扩展已有的类、结构体、枚举或协议,增加新功能。...文章解释了扩展的基本概念及其在所谓的逆向建模的应用,让你能在无法访问源代码的情况下,仍能为类型添加自定义功能层。通过示例展示了如何在不同情境下使用扩展,包括为类型添加新属性、实现协议及提供默认行为。

    16630
    领券