2016-08-22 3 views
14

У нас есть пользовательский объект UIApplication, поэтому наш main.swift былXcode 8 бета-6: main.swift не будет компилировать

import Foundation 
import UIKit 

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate)) 

и что не работает в Xcode 8 бета-5, поэтому мы использовали этот

//TODO Swift 3 workaround? https://forums.developer.apple.com/thread/46405 
UIApplicationMain(Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self)) 

на Xcode 8 бета-6 мы получаем использование неразрешенного идентификатора 'процесса'

Что нам нужно сделать в Xcode 8 бета-6/Swift 3 для определения UIApplicationMain?

+0

Как указать класс UIApplication таким образом? –

ответ

31

Я пишу это следующим образом:

UIApplicationMain(
    CommandLine.argc, 
    UnsafeMutableRawPointer(CommandLine.unsafeArgv) 
     .bindMemory(
      to: UnsafeMutablePointer<Int8>.self, 
      capacity: Int(CommandLine.argc)), 
    nil, 
    NSStringFromClass(AppDelegate.self) 
) 

Для того, чтобы изменить класс UIApplication, заменить NSStringFromClass(MobileUIApplication.self) для nil в этой композиции.

Однако, если ваш только цель здесь подменить UIApplication подкласс в качестве общего экземпляра приложения, есть более простой способ: в Info.plist, добавьте ключ «Главный класс» и установите его значение имя строки вашего подкласса UIApplication и пометьте ваше объявление этого подкласса атрибутом @objc(...), давая ему то же имя Objective-C.

3

кажется Process был переименован в CommandLine в бета-версии 6.

CommandLine

Но тип CommandLine.unsafeArgv является несовпадающим вторым аргументом UIApplication, поэтому вам могут понадобиться, чтобы написать что-то вроде этого:

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in 
    _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self)) 
} 

(ДОПОЛНЕНО) Это несоответствие должно рассматриваться как ошибка. Как правило, вам лучше отправить bug report, когда вы найдете вещи «этого не следует», как третий параметр в бета-версии 5. Я надеюсь, что эта «ошибка» будет исправлена ​​в ближайшее время.


Если вы просто хотите указать свой пользовательский класс UIApplication, почему бы вам не использовать Info.plist?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication 

(показан как «Основной класс» в несырьевой ключах/значения просмотр.)

с этим в вашем Info.plist, вы можете использовать MobileUIApplication с обычным способом с использованием @UIApplicationMain.

(Сложение) Заголовок док из UIApplicationMain:

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no 
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init. 
+0

Обратите внимание, что эта ситуация считается ошибкой. Этот ответ более или менее идентичен приведенному здесь: https://bugs.swift.org/browse/SR-1390?focusedCommentId=17441&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment -17441 – matt

+0

@matt, я не думаю, что сообщение 'Process' переименовано в' CommandLine' не идентично отчету об ошибке.Но, да, по-видимому, основной код в моем ответе показывает обходной путь для ошибки, и я обновлю часть. – OOPer

+0

NSPrincipalClass не имеет значения при использовании iOS. Но мы знаем OP _is_, используя iOS, или мы не будем говорить о UIApplicationMain. – matt

Смежные вопросы