2016-03-26 3 views
7

У меня расстраивающая ситуация с Swift 2.2 (Xcode 7.3). Чтобы имитировать его, просто создайте переменную в определенном пользователем родовом классе и укажите этот класс из другого места. Например:Проблема с генераторами Swift 2.2 (Xcode 7.3)

class A<T> { 
    let genVar = 1 
} 

class MyViewController: UIViewController { 
    let myVar = A<Int>() // crash is here 
} 

Если вы будете запускать этот код на устройстве под управлением IOS 7 (iPhone 4, в моем случае), это приведет к краху на попытку создания переменной общего типа. Вот первые строки журнала аварии устройства:

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Subtype: KERN_PROTECTION_FAILURE at 0x00298910 
Triggered by Thread: 0 

Thread 0 Crashed: 
0 libswiftCore.dylib    0x006b1d64 0x4bd000 + 2051428 
1 Phone       0x001c76ec 0xab000 + 1165036 
2 libswiftCore.dylib    0x006b307c 0x4bd000 + 2056316 
3 libswiftCore.dylib    0x006b2f70 0x4bd000 + 2056048 
4 libswiftCore.dylib    0x006b0f24 0x4bd000 + 2047780 
5 libswiftCore.dylib    0x006b107c 0x4bd000 + 2048124 
6 Phone       0x0014e730 0xab000 + 669488 
7 Phone       0x00129390 0xab000 + 517008 
8 UIKit       0x31e9d9c4 -[UIClassSwapper initWithCoder:] + 188 

КСН 8 и 9 тренажеров/устройств, приведенный выше код работает нормально.

Быстро ли поддержка iOS 7 в ближайшем будущем?

+1

[Этот вопрос недостаточно описывает проблему] (http://importblogkit.com/2015/07/does-not-work/), и я проголосовал за закрытие. Вы должны, как минимум, включать трассировку стека iOS 7, а также описание *, когда * приложение вылетает. Это когда приложение загружается? Когда этот контроллер открывается с первого взгляда? Когда это свойство доступно? – nhgrif

+0

Вопрос редактируется. – Vas

+0

Вы не добавили никакой полезной информации. Нам нужны символы. Если произошел сбой при объявлении переменной экземпляра, вам нужно показать код, инициализирующий класс, содержащий переменную экземпляра. Я не могу воспроизвести это с помощью того, что вы мне дали, и вы не дали никакой полезной информации для отладки. – nhgrif

ответ

1

Как this bug предполагает, вы следующие возможные обходные пути:

  • делают класс необщего
  • удалить value свойство
  • своп object и value декларации свойства
  • инициализировать объект в init

Вероятно, лучшим решением является инициализировать объект в init:

class A<T> { 
    let genVar: Int 
    init() { 
     genVar = 1 
    } 

} 

class MyViewController: UIViewController { 
    let myVar = A<Int>() // no crash 
} 
+0

Пункт 4 балла не работал для меня. –

+0

@ alpsystems.com, основанный на вашем ответе, я думаю, что это может быть другая ошибка. Пример (который является точкой 4 балла) должен работать. – Daniel

3

Я споткнулся на то, что, как представляется, две ошибки с Swift генериков прошивкой 7. Вот как их исправить.

Ошибка № 1 - вы должны определить общий объект как первое свойство в своем классе перед любыми другими.

Примера - этот код не:

public class TestIOS7<T> { 

    private var x: Int? 
} 

let x = TestIOS7<String>() 

Но вот обходной путь:

public class TestIOS7<T> { 

    private var kludge: T? 
    private var x: Int? 
} 

let x = TestIOS7<String>() 

Ошибка # 2: ограничения класса кажется совершенно разбитым.

Примера - этот код не:

class ClassA<B: ClassB> { } 

class ClassB { } 

let x = ClassA <String>() 

Я не нашел обходной путь, кроме удаления «ClassB» ограничения и переписывания всего кода, чтобы иметь дело с тем, что в основном, этим языком функция больше не существует , Это особенно болезненно, когда вам нужно вызвать инициализатор ClassB из ClassA - мне пришлось переписать этот блок с помощью hardwired if/then/else для всех моих подклассов ClassB, пока Apple не исправит это.

Если кто-то найдет обходное решение для Bug # 2, пожалуйста, дайте мне знать!

+0

относительно ошибки № 2: код не должен компилироваться, поскольку ClassB не является предком String. Таким образом, это поведение действительно правильно. – Daniel

+0

Это отлично работает: class Class {} '' class ClassB {} '' class ClassC: ClassB {} '' let x = ClassA () ' – Daniel

0

Мы столкнулись с той же проблемой.

Обнаружен обход, хотя это, по крайней мере, позволило бы нам поддерживать iOS7 без существенного переписывания.
Похоже, что все подклассы также должны быть общими, чтобы родительский родовой файл корректно работал в iOS7.
Общий тип подкласса не имеет значения, и он не обязательно должен быть родовым типом родителя.

Я также разместил этот ответ на обсуждении bug simpleBob.

Пример:

// This heavily pollutes the codebase, so let's keep track of it but using a common meaningless generic value so we can find and destroy later when we no longer support iOS7 
protocol iOS7SwiftGenericFixProtocol {} 
struct iOS7SwiftGenericFixType: iOS7SwiftGenericFixProtocol {} 

class GenericClass<T> { 
    var value: T? 
    let attribute = 0 
} 

class GenericSubclass<Element: iOS7SwiftGenericFixProtocol>: GenericClass<Int> { 
    let otherAttribute = 0 
} 

let _ = GenericSubclass<iOS7SwiftGenericFixType>() 
0

С Xcode 7.3.1, единственная проблема с моим родовым классом, что он был унаследовать от NSObject. Удаление наследования было достаточно, порядок объявления свойств не имел значения.

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