【问题标题】:Sharing classes between iOS and watchOS在 iOS 和 watchOS 之间共享课程
【发布时间】:2018-03-09 14:53:31
【问题描述】:

我目前有一个 iOS 应用程序。根据用户位置,它使用一个类或另一个类。我如何为我的 iOS 应用程序执行此操作?我有一个protocol

protocol ParseProtocol {

    var urlToParse: URL? { get }
    var parsedXMLData: [MyData] { get }

    func parseFeed()

    init()
}

然后在ViewController 上,当我检测到用户所在的城市时,会调用parser 函数并根据用户所在的String 生成一个类:

func parser(for city: String) -> ParseProtocol? {

        let bundlePath     = Bundle.main.bundlePath
        let bundleFullName = bundlePath.components(separatedBy: "/").last
        let bundleName     = bundleFullName?.components(separatedBy: ".").first
        let combinedName   = bundleName! + "." + cityIn + "Parser"
        let Class          = NSClassFromString(combinedName) as? ParseProtocol.Type

        print("CITY: \(city)  \(combinedName)")

        return Class?.init()
    }

现在,我正在开发一个 watchOS 复杂功能,我想为 watchOS 和 iOS 使用与以前相同的类,因为它们是相同的。我的问题来了,因为它们是不同的捆绑包,combinedName 不同:

  • watchOS combinedName 是 MyApp-watchOS Extension.LondonParser
  • iOS combinedName 是 MyApp.LondonParser

我很困在这里,不知道如何实现这一点。

【问题讨论】:

  • 如何将LondonParser 和其他类似的类添加到 WatchKit 扩展目标中?一个类可以在多个目标中

标签: ios swift watchos watchos-4


【解决方案1】:

如果你需要基于当前bundle使用NSClassFromString,你可以这样做:

let targetName = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
let Class = NSClassFromString("\(targetName).\(className)") as? ParseProtocol.Type

当然,每个目标的目标名称都会不同,但这没问题,如果您将所需的类添加到目标。从扩展目标,您无法访问仅添加到宿主应用目标的类。

澄清:您的应用程序包含一个或多个产品(目标)。每个目标都有三个名称:

  1. 显示名称:主屏幕应用图标下方显示的名称
  2. 包标识符:目标的(全局)唯一标识符
  3. 目标名称:在编译时用于识别目标的名称

第三个名字是用于创建类的名字NSClassFromString。另请注意,目标名称不得包含"MyApp-watchOS Extension" 中的空格。然后编译器找不到该类。

【讨论】:

  • 我的问题是是否可以访问项目中的类。它目前已添加到两个目标(iOS + watchOS 扩展),但我做不到。我不想为我的 iOS 应用程序和我的 watchOS 应用程序创建重复的类。
  • 将同一个类添加到多个目标有什么问题?无论如何,没有“项目类”。该项目只是目标的容器。也许您可以使用import MyApp 将您的主机应用程序目标导入您的手表扩展程序。但我很确定这会引发比它解决的问题更多的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
相关资源
最近更新 更多