在iOS和watchOS之间共享类

时间:2018-03-09 14:53:31

标签: ios swift watch-os watch-os-4

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

protocol ParseProtocol {

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

    func parseFeed()

    init()
}

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

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

我非常困在这里,并且不知道如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

如果您需要根据当前捆绑使用NSClassFromString,可以这样做:

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

当然,目标名称对于每个目标都是不同的,但是如果您将所需的类添加到目标,则没有问题。从扩展目标,您无法访问仅添加到主机应用程序目标的类。

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

  1. 显示名称:主屏幕上应用图标下显示的名称
  2. 包标识符:目标
  3. 的(全局)唯一标识符
  4. 目标名称:在编译期间用于标识目标的名称
  5. 第三个名称是用NSClassFromString创建类的名称。另请注意,目标名称不得包含"MyApp-watchOS Extension"中的空格。然后编译器找不到类。