Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS和watchOS之间共享类_Ios_Swift_Watchos_Watchos 4 - Fatal编程技术网

在iOS和watchOS之间共享类

在iOS和watchOS之间共享类,ios,swift,watchos,watchos-4,Ios,Swift,Watchos,Watchos 4,我目前有一个iOS应用程序。根据用户位置,它使用一个类或另一个类。我如何为我的iOS应用程序做到这一点?我有一个协议: protocol ParseProtocol { var urlToParse: URL? { get } var parsedXMLData: [MyData] { get } func parseFeed() init() } 然后在ViewController上,当我检测到用户所在的城市时,调用parser函数,并根据用户所在的字符

我目前有一个iOS应用程序。根据用户位置,它使用一个类或另一个类。我如何为我的iOS应用程序做到这一点?我有一个
协议

protocol ParseProtocol {

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

    func parseFeed()

    init()
}
然后在
ViewController
上,当我检测到用户所在的城市时,调用
parser
函数,并根据用户所在的
字符串生成一个类:

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扩展名。LondonParser
  • iOS
    combinedName
    是MyApp.LondonParser

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

如果您需要基于当前捆绑包使用
NSClassFromString
,您可以这样做:

let targetName = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
let Class = NSClassFromString("\(targetName).\(className)") as? ParseProtocol.Type
当然,每个目标的目标名称都会不同,但是如果您将所需的类添加到目标中,这没有问题。从扩展目标,您无法访问仅添加到主机应用目标的类

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

  • 显示名称:主屏幕上应用程序图标下显示的名称
  • 捆绑包标识符:目标的(全局)唯一标识符
  • 目标名称:编译时用于标识目标的名称

  • 第三个名称是用于创建带有
    NSClassFromString
    的类的名称。还请注意,目标名称不得包含类似于
    “MyApp watchOS Extension”
    中的空格。编译器随后找不到该类。

    如何将
    LondonParser
    &添加到WatchKit扩展目标中的其他类似类?一个类可以位于多个目标中我的问题是,是否可以访问项目中的类。它目前已添加到两个目标(iOS+watchOS扩展),但我无法做到这一点。我不希望iOS应用程序和watchOS应用程序有重复的类。将同一类添加到多个目标有什么问题?无论如何,没有“项目类”。项目只是目标的容器。也许您可以使用
    import MyApp
    将主机应用目标导入手表扩展。但我非常确信,这将带来比解决问题更多的问题。