我目前有一款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
不同:
combinedName
是MyApp-watchOS Extension.LondonParser combinedName
是MyApp.LondonParser 我非常困在这里,并且不知道如何实现这一目标。
答案 0 :(得分:1)
如果您需要根据当前捆绑使用NSClassFromString
,可以这样做:
let targetName = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
let Class = NSClassFromString("\(targetName).\(className)") as? ParseProtocol.Type
当然,目标名称对于每个目标都是不同的,但是如果您将所需的类添加到目标,则没有问题。从扩展目标,您无法访问仅添加到主机应用程序目标的类。
澄清:您的应用程序由一个或多个产品(目标)组成。每个目标有三个名称:
第三个名称是用NSClassFromString
创建类的名称。另请注意,目标名称不得包含"MyApp-watchOS Extension"
中的空格。然后编译器找不到类。