ios - Swift 2.2 泛型问题 (Xcode 7.3)

标签 ios swift xcode7.3 swift2

我在使用 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/

相关文章:

ios - 尝试设置 iOS 应用程序的背景时出错

ios - 第二次添加/删除断言失败

ios - 尝试用 Swift 协议(protocol)理解一些东西

ios - SwiftUI - 禁用某些 View 从右到左语言翻转

ios - 如何保存带有混响效果的录制音频

ios - 如何在 MSMessage 中嵌入 URL?

ios - swift 如何比较泛型

ios - 在另一个 Controller 中显示/隐藏 UIButton

swift - 如何更改 searchController?.searchBar 的大小和位置?

ios - 未在曲棍球门户网站 (iOS) 中获取崩溃详细信息