我在使用 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 的支持?
最佳答案
我被 iOS 7 中 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 的初始值设定项时,这尤其痛苦 - 我不得不为我的所有 ClassB 子类使用硬连线 if/then/else 重写该 block ,直到 Apple 修复此问题。
如果有人确实找到了 Bug #2 的解决方法,请告诉我!
关于ios - Swift 2.2 泛型问题 (Xcode 7.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235369/