【问题标题】:Defining packages with interfaces on Swift在 Swift 上定义带有接口的包
【发布时间】:2023-01-05 15:20:08
【问题描述】:

我在 C# 和 Java 等语言方面有更多经验,所以也许我问错了问题,但我试图在 Swift 包上定义一个接口,因此任何实现该接口(或协议)的包都可以替换它。 例如,在数据访问包上,我想用 CRUD 方法定义一个接口,这样如果我用另一种类型更改数据库,其余代码不会受到影响。 如果可能的话?如果答案是“是”,那么实现这一目标的最佳方法是什么?

【问题讨论】:

  • 协议是最接近接口的 Swift 等价物。它们允许您定义事物的属性和方法(甚至一些默认方法实现)而不是事物本身)。
  • 我将补充说,协议的默认设置是在协议扩展中完成的。
  • 太棒了@Paulw11!关于文件夹/组结构有一个标准吗?例如,我记得在 C# 中,他们通过我来创建,例如:MyPackage |____MyPackage.Interface | |____AnInterface.cs |____AnInterfaceImplementation.cs
  • swift 中的所有文件都具有 .swift 扩展名。 Swift Package Manager 有一个包结构,但这与协议的使用无关
  • @Paulw11 糟糕,我忘记了 cmets 上的格式。在前面的评论中要向您展示的是,在 C# 上我得到了 something like this,其中我有一个包含实现的包(即 BusinessLogic)和另一个包含这些实现必须使用的接口的包(即 BusinessLogic.Interface)

标签: ios swift interface package protocols


【解决方案1】:

您可以创建两个单独的 swift 包。一个包只是协议(接口),另一个包是符合协议的结构或类(实现)。例如...

接口包

public protocol SomeInterface {
     func doSomething()
}

和实施包

public struct SomeImplementation: SomeInterface {
     func doSomething() {
          //stuff happens here
     }
}

Implementation 包必须将 Interface 包作为 Package.swift 文件中的依赖项

 dependencies: [
    // Dependencies declare other packages that this package depends on.
    .package(url: "https://example.com/some-interface.git", from: "1.2.3"),
 ],
 targets: [
    // Targets are the basic building blocks of a package. A target can define a module or a test suite.
    // Targets can depend on other targets in this package, and on products in packages this package depends on.
    .target(
        name: "SomeImplementation",
        dependencies: ["SomeInterface"]),
    .testTarget(
        name: "SomeImplementation Tests",
        dependencies: ["SomeImplementation"]),
 ]

通过这种方式,您可以注入符合您添加到项目中的协议包的实现。

init(dependency: SomeInterface) {
     dependency.doSomething()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多