extension_access_modifier swiftlint 是什么意思?

12
我在项目中添加了Swiftlint,但我不太明白extension_access_modifier警告是什么意思。我主要在一个被声明为public的类上看到它,但代码库中遍布着添加功能的扩展程序。
public class Foo {

}

// In SomeOtherClass.swift
extension Foo { // Extension Access Modifier Violation: Prefer to use extension access modifiers
    public func baz()
}

每当另一个类中出现extension Foo时,我会在扩展程序上收到该警告。 请有人解释一下这是什么意思?

它可能更喜欢extensionpublic,而不是func - Alexander
@Alexander 当我在扩展中添加 public (例如 public extension foo),警告会出现在 public func baz() 方法上。 - Crystal
如果 extension 明确为 public,则 func 不需要是公共的。 - Alexander
@Alexander,你能把你的评论放在答案里吗?它起作用了。在baz()函数上不要使用public扩展。 - Crystal
1个回答

21

更清晰地表达您的扩展是公共的,而不是所有成员:

建议使用:

public extension Foo {
    func bar() { ... }
    func baz() { ... }
    func qux() { ... }
}

结束

extension Foo {
    public func bar() { ... }
    public func baz() { ... }
    public func qux() { ... }
}

1
我的项目恰好相反。我猜这是为了避免向使用你的库的用户垃圾邮件式地推销你的扩展,即我得到的是:“没有扩展访问修饰符违规:更倾向于使用扩展访问修饰符(no_extension_access_modifier)”。 - mfaani
@Honey 我展示的两种变体最终都会“向您的库用户发送您的扩展名的垃圾邮件”。在这两种变体中,barbazqux仍然是公共的。 - Alexander
没错。我只是想指出,如果你这样写public extension Foo,我的swiftlint会弹出一个警告。我在搜索我遇到的错误时来到了这个页面。它与问题中的错误类似,但完全相反。 - mfaani
1
除非你只有一个函数,否则它会抱怨。不确定这是否有帮助:extension AppDelegate { public func initXxxxx() {} 因为你添加的任何后续函数,你可能不想让它们成为公共的。或者它们可能会因为错误而变成公共的。 - Jonny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接