Ios Swift 2.2泛型问题(Xcode 7.3)

Ios Swift 2.2泛型问题(Xcode 7.3),ios,swift,xcode7.3,swift2.2,Ios,Swift,Xcode7.3,Swift2.2,我在Swift 2.2(Xcode 7.3)中遇到了令人沮丧的情况。要模拟它,只需在用户定义的泛型类中创建一个变量,并从其他地方引用该类。例如: class A<T> { let genVar = 1 } class MyViewController: UIViewController { let myVar = A<Int>() // crash is here } 在iOS 8和iOS 9模拟器/设备上,上述代码可以正常工作 iOS 7的Swift

我在Swift 2.2(Xcode 7.3)中遇到了令人沮丧的情况。要模拟它,只需在用户定义的泛型类中创建一个变量,并从其他地方引用该类。例如:

class A<T> {
    let genVar = 1
}

class MyViewController: UIViewController {
    let myVar = A<Int>() // crash is here
}
在iOS 8和iOS 9模拟器/设备上,上述代码可以正常工作

iOS 7的Swift支持是否将在不久的将来取消?

正如所建议的,您有以下可能的解决方法:

  • 使类非泛型
  • 删除
    属性
  • 交换
    对象
    属性声明
  • init
最好的解决方法可能是在
init
中初始化对象:

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

}

class MyViewController: UIViewController {
    let myVar = A<Int>() // no crash
}
A类{
让genVar:Int
init(){
genVar=1
}
}
类MyViewController:UIViewController{
让myVar=A()//无崩溃
}

我被iOS 7中Swift泛型的两个bug绊倒了。下面是修复它们的方法

Bug#1-必须先将泛型定义为类中的第一个属性,然后再定义其他属性

示例-此代码失败:

public class TestIOS7<T> {

    private var x: Int?
}

let x = TestIOS7<String>()
class ClassA<B: ClassB> { }

class ClassB { }

let x = ClassA <String>()
公共类测试7{
私有变量x:Int?
}
设x=TestIOS7()
但解决办法如下:

public class TestIOS7<T> {

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

let x = TestIOS7<String>()
公共类测试7{
二等兵克劳奇:T?
私有变量x:Int?
}
设x=TestIOS7()
Bug#2:类约束似乎完全被打破了

示例-此代码失败:

public class TestIOS7<T> {

    private var x: Int?
}

let x = TestIOS7<String>()
class ClassA<B: ClassB> { }

class ClassB { }

let x = ClassA <String>()
ClassA{}
类B{}
设x=ClassA()
除了删除“ClassB”约束和重写所有代码来处理基本上不存在这种语言特性这一事实之外,我还没有找到任何解决方法。当您需要从ClassA调用ClassB的初始值设定项时,这尤其令人痛苦-我必须用硬连线if/then/else为我的所有ClassB子类重写该块,直到Apple修复此问题


如果有人真的找到了Bug#2的解决方法,请告诉我

我们面临同样的问题

我们发现了一种变通方法,至少可以让我们在不进行重大重写的情况下支持iOS7。
看起来所有子类也必须是泛型的,这样父泛型才能在iOS7中正常工作。
子类的泛型类型无关紧要,也不需要是父类的泛型类型

我还在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>()
//这严重污染了代码库,所以让我们跟踪它,但使用一个常见的无意义泛型值,以便在以后不再支持iOS7时找到并销毁它
协议iOS7SwiftGenericFixProtocol{}
结构iOS7SwiftGenericFixType:iOS7SwiftGenericFixProtocol{}
类泛型类{
var值:T?
让属性=0
}
类GenericSubclass:GenericClass{
让otherAttribute=0
}
let u=GenericSubclass()

对于Xcode 7.3.1,我的泛型类唯一的问题是它继承自NSObject。删除继承就足够了,财产声明的顺序无关紧要。

,我已经投票决定结束。您至少应该包括iOS 7崩溃堆栈跟踪,以及应用程序崩溃时间的描述。是应用程序加载的时候吗?首次访问此视图控制器的时间?何时访问此属性?问题已编辑。您没有添加任何有用的信息。我们需要符号。如果崩溃发生在实例变量的声明上,则需要显示初始化包含实例变量的类的代码。我不能用你给我的复制这个,你也没有提供任何有用的调试信息。这很可能是一个Swift 2.2错误,这将是一个优秀的错误报告给苹果。但我们对此无话可说。这不是堆栈溢出问题。可能与和有关。我也有同样的问题,我的类有一半是泛型的,而且它们似乎在swift 2.2/Xcode 7.3 UpdateReading Bug#2之后崩溃了:代码不应该编译,因为ClassB不是String的祖先。因此,这种行为实际上是正确的。这很好:
ClassA{}
ClassB{}
ClassC:ClassB{}
让x=ClassA()
@alpsystems.com根据您的回答,我认为这可能是一个不同的错误。这个例子(即要点4)应该是可行的。。