swift2 Swift 2.2泛型(Xcode 7.3)的问题

pw136qt2  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(276)

我在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

在iOS 8和9模拟器/设备上,上面的代码工作正常。
Swift对iOS 7的支持是否会在不久的将来被取消?

vhmi4jdf

vhmi4jdf1#

我被iOS7中的两个Swift泛型错误绊倒了。
错误#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”约束并重写所有代码来处理这个语言特性基本上已经不存在的事实之外,我还没有找到任何解决办法。当你需要从ClassA调用ClassB的初始化器时,这是特别痛苦的--我不得不用硬连线的if/then/else为我所有的ClassB子类重写那个块,直到苹果修复了这个问题。
如果有人找到了Bug #2的解决方法,请告诉我!

x6492ojm

x6492ojm2#

this bug所示,您可以使用下列可能的解决方法:

  • 使类成为非泛型
  • 删除value属性
  • 交换objectvalue属性声明
  • 初始化init中的对象

最好的解决方法可能是初始化init中的对象:

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

}

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

jk9hmnmh3#

我们面临着同样的问题。
一个变通办法被发现,虽然这将至少让我们支持iOS7没有重大重写。
看起来所有子类也必须是泛型的,这样父泛型才能在iOS7中正常工作。
子类的泛型类型无关紧要,它不需要是父类的泛型类型。
我还在simpleBob链接的bug讨论上发布了这个答案。
示例:

// 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>()
wlwcrazw

wlwcrazw4#

在Xcode 7.3.1中,我的泛型类的唯一问题是它继承了NSObject。删除继承就足够了,属性声明的顺序并不重要。

相关问题