В настоящее время у меня есть приложение для iOS. В зависимости от местоположения пользователя он использует тот или иной класс. Как я это делаю для своего приложения для iOS? У меня protocol:
protocol ParseProtocol {
var urlToParse: URL? { get }
var parsedXMLData: [MyData] { get }
func parseFeed()
init()
}
А затем на ViewController, когда я определяю город, в котором находится пользователь, вызывается функция parser и генерирует класс в зависимости от 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:
combinedName - это MyApp-watchOS Extension.LondonParsercombinedName - это 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". Тогда компилятор не может найти класс.
Мой вопрос в том, можно ли получить доступ к классу, который есть в проекте. В настоящее время он добавлен к обеим целям (расширение iOS + watchOS), но я не могу этого сделать. Я бы хотел, чтобы классы не повторялись для моего приложения iOS, а затем и для моего приложения watchOS.
В чем проблема с добавлением одного и того же класса к нескольким целям? Во всяком случае, «классов проекта» нет. Проект - всего лишь контейнер для целей. Возможно, вы сможете импортировать целевое приложение хоста в расширение для часов с помощью import MyApp. Но я почти уверен, что это вызовет больше проблем, чем решит.
как насчет добавления
LondonParserи других подобных классов к цели расширения WatchKit? Один класс может быть в нескольких целях