Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 泛型类和子类的数组_Arrays_Swift_Generics_Inheritance - Fatal编程技术网

Arrays 泛型类和子类的数组

Arrays 泛型类和子类的数组,arrays,swift,generics,inheritance,Arrays,Swift,Generics,Inheritance,我很难理解泛型。我想要的是有一个泛型类数组,每个泛型类都有自己的关联类型,并相应地调用一个函数。它看起来像这样: class SomeGenericClass<U> { func addCallback(callback: (U)->() ) { ... } } var array: [SomeGenericClass] // compile error class SuperClass { func addCallback<V>(callbac

我很难理解泛型。我想要的是有一个泛型类数组,每个泛型类都有自己的关联类型,并相应地调用一个函数。它看起来像这样:

class SomeGenericClass<U> {
    func addCallback(callback: (U)->() ) { ... }
}

var array: [SomeGenericClass] // compile error
class SuperClass {
    func addCallback<V>(callback: (V)->() ) { ... }
}

class SomeGenericClass<U> {
    func addCallback<V: U>(callback: (V)->() ) { ... } // compile error
}

var array: [SuperClass] // no compile error
genericFirst.addCallback { value in
    // value is indeed of type UIImage
    someImageView.image = value
}

在这种情况下,使用超类是正确的方法吗?应该如何实现它?

我通过将数组成员存储在它们自己的变量中来解决这个问题。也就是说,不是像这样定义我的数组:

lazy var array: [SuperClass] = [
    SomeGenericClass<UIImage>(),
    SomeGenericClass<Int>(),
    //etc...
]

感谢您将最终目标包括在内。那是不可能的<代码>值必须具有编译时已知的单一类型。不必写下类型并不意味着编译器不必知道它是什么。假设您对其类型一无所知,那么接下来您将编写使用
值的哪一行代码?试着编写一个回调块来处理这个问题,并做一些比调用
print(value)
更多的事情,记住我可以将
array[0]
更改为我想要的任何内容,而你的代码仍然需要工作。了解泛型的最好方法是从有重复的具体代码开始。然后找出如何使用泛型消除重复。从泛型开始,然后试图找到如何使用它们,几乎总是会让你陷入困境。因此,在一个没有泛型的世界里,你只需要为每种类型复制代码,你会在这里写什么?谢谢你的评论。我更新了一些我想要的代码。这根本不可能吗?我们可能的解决方法是什么?我认为还需要注意的是,我的数组是常量,它是在一个惰性变量中定义的,不会改变——实际上,它是一个字典。因此,当我访问一个元素时,我肯定知道它将是什么类型。也许我们可以利用它,改变结构类型?但是如果
array[0]
元素是
SomeGenericClass
,那么为什么需要执行
someImageView.image=value
。在这种情况下,
的类型为
Int
。这里的
数组
的用途是什么?什么代码使用它?(这取决于你的问题,这可能是一个完全正确的解决方案,所以我不确定你说这不合适是什么意思。也就是说,我不明白为什么这些都是懒惰的。这看起来非常浪费。)这个数组存储一个列表和一个视图,它是一种组织一个长滚动视图的方法,作为一个窗体,具有不同的单元格和控件,并且有一种通用的方法来用输入对象的值填充视图,并监听这些控件的更改。ok;如果这些都是UIView,您只需在它们上面循环,然后对它们执行类似于
addSubview
的操作,将它们放入scrollview,那么您的解决方案是理想的,您应该如何编写它(我已经构建了这样的系统很多年了)。您需要直接访问的内容的属性,以及用于保存所有内容的数组。本质上与故事板充满视图的方式相同,并且您希望对其进行特定访问的那些视图创建了一个IBOutlet属性。很高兴听到这一点!我当时接受了答案。非常感谢。
lazy var genericFirst: SomeGenericClass<UIImage> = SomeGenericClass<UIImage>()
lazy var genericSecond: SomeGenericClass<Int> = SomeGenericClass<Int>()
// etc...

lazy var array: [SuperClass] = [
    genericFirst,
    genericSecond,
    //etc...
]
genericFirst.addCallback { value in
    // value is indeed of type UIImage
    someImageView.image = value
}