weak不能应用于非类型的uiimageview

use*_*076 8 weak-references swift

我有一个swift类,需要一个指向另一个类中分配的对象数组的弱指针.我有

class myView: UIView
{
    var lines:[CAShapeLayer] = []
    weak var avatars : [UIImageView]?
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

'weak'不能应用于非类型'[UIImageView]'

我也试着无济于事:

weak var avatars : [UIImageView?]?
Run Code Online (Sandbox Code Playgroud)

小智 27

弱无法应用于非类类型:

这意味着您不能对任何值类型实例(例如,Array,Dictionary,String等)进行弱引用,因为这些都是struct而不是class.你只给出了类型的弱引用(例如UIImage,UIImageView等).在这种情况下,你试图给UIImageView数组提供弱引用,我们知道数组是一个值类型,所以它是不可能的.

例如:

weak var str: String? //CompileTime Error(Wrong)

weak var arr: Array? //CompileTime Error(Wrong)

weak var imageView: UIImageView? //Correct
Run Code Online (Sandbox Code Playgroud)

如果是Protocol:如果我们只有struct类型的协议:

protocol SomeProtocol{
    func doSomething()  
}
Run Code Online (Sandbox Code Playgroud)

我们不能将此类型的变量声明为弱:

weak var delegate: SomeProtocol? //CompileTime Error(Wrong)
Run Code Online (Sandbox Code Playgroud)

但是如果我们像这样制作类类型的协议:

protocol SomeProtocol: class{
    func doSomething()
}
Run Code Online (Sandbox Code Playgroud)

我们可以将这种类型的变量声明为弱:

weak var delegate: SomeProtocol? //Correct
Run Code Online (Sandbox Code Playgroud)

我想你很容易理解它,为什么会在协议中发生?

同样的原因:你只给出了类型的弱引用


mat*_*att 9

需要有一个指向对象数组的弱指针

好吧,正如错误消息告诉你的那样,你不能.Array是一个结构,而不是一个类.您不能对结构实例有弱引用; 它是一个值类型,因此它不进行weak内存管理.

它也不需要它 - 没有保留周期的危险,因为这是一种值类型.你应该问问自己为什么你认为它确实需要它.也许你认为weak和可选总是在一起,但他们没有.你已经宣布这是一个Optional数组; 这当然足够了.


Een*_*dje 2

您正在尝试申请weakofArray类型UIImageViewArray是一个结构体。