在iOS和watchOS之间共享类
我目前有一个iOS应用程序。根据用户位置,它使用一个类或另一个类。我如何为我的iOS应用程序做到这一点?我有一个在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函数,并根据用户所在的字符
协议
:
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
将主机应用目标导入手表扩展。但我非常确信,这将带来比解决问题更多的问题。