2016-05-24 3 views
1

В моем файле main.swift У меня есть 2 разных основных приложений для тестирования и приложения:Ссылка на AppDelegate, когда разные UIApplicationMain

if NSClassFromString("XCTestCase") != nil { 
    UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegateTesting)) 
} else { 
    UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate)) 
} 

В приложении я экранным к AppDelegate:

extension UIApplication { 
    static func getAppDelegate() -> AppDelegate { 
     return UIApplication.sharedApplication().delegate as! AppDelegate 
    } 
} 

поэтому, делаю XCTests, не работает. Как это исправить? Я не хочу дублировать код. Может быть, издеваться над этим или создать протокол для UIApplication.
Спасибо!

+0

Я занимаюсь разработкой приложений iOS с 2009 года, и я никогда не видел двух разных приложений AppDelegates в одном приложении. Я думаю, вы делаете что-то неправильно. Что вы пытаетесь решить? – dasdom

+1

@dasdom, я всегда использую 2 AppDelegates: http://qualitycoding.org/app-delegate-for-tests/. Проблема, с которой сталкивается OP, заключается в том, как реализовать 'getAppDelegate' со строгими правилами типа Swift. –

ответ

2

Во-первых, я покажу вам, как это сделать. Тогда я буду спорить, что вы, вероятно, не должны.

Как это сделать:

Интерфейсы используются повсеместно Java для поддержки тестирования. В Objective-C для замены разных реализаций не требуется протоколов. Но в Swift протоколы - это способ поддержки нескольких реализаций (тестирования и производства) одного и того же интерфейса.

protocol AppDelegateProtocol { 
    // whatever you need 
} 

extension UIApplication { 
    static func getAppDelegate() -> AppDelegateProtocol { 
     return UIApplication.sharedApplication().delegate as! AppDelegateProtocol 
    } 
} 

Конечно, как AppDelegate и AppDelegateTesting должны соответствовать AppDelegateProtocol.

Почему вы, вероятно, не должны делать это:

Целью делегата приложения является предоставление методов управления жизненным циклом приложений.

Почему вы хотите получить удобный доступ к делегату приложения? Я предполагаю, что вы используете его как синглтон, удобное место для хранения свойств приложения. Не. Посмотрите на каждое свойство и решите, что вы хотите с ним делать. Некоторые могут принадлежать друг другу. Но, по моему опыту, AppDelegate становится свалкой для атрибутов, которые не имеют никакого отношения к управлению жизненным циклом UIApplication.

Вместо этого найдите способы извлечения цепей сцепления.

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