1

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

protocol ParseProtocol {

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

    func parseFeed()

    init()
}

然后ViewController当我检测到用户所在的城市时, parser调用函数并根据用户所在的 a 生成一个类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

  • watchOScombinedName是 MyApp-watchOS Extension.LondonParser
  • iOScombinedName是 MyApp.LondonParser

我被困在这里,不知道如何实现这一目标。

4

1 回答 1

1

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

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

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

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

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

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

于 2018-03-09T18:24:52.613 回答