我在swift中有一个类,它需要一个指向另一个类中分配的对象数组的弱指针。我有
class myView: UIView
{
var lines:[CAShapeLayer] = []
weak var avatars : [UIImageView]?
我得到的错误是
'弱'不能应用于非类型的类型' [UIImageView]'
我也试着无济于事:
weak var avatars : [UIImageView?]?
答案 0 :(得分: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
如果是议定书: 如果我们只有一个struct类型的协议:
protocol SomeProtocol{
func doSomething()
}
我们不能将此类型的变量声明为弱:
weak var delegate: SomeProtocol? //CompileTime Error(Wrong)
但是如果我们这样制作类型的协议:
protocol SomeProtocol: class{
func doSomething()
}
我们可以将此类型的变量声明为弱:
weak var delegate: SomeProtocol? //Correct
我认为你很容易理解,为什么会在协议中发生这种情况?
同样的原因:你只给出了类型
的弱引用答案 1 :(得分:9)
需要有一个指向对象数组的弱指针
好吧,正如错误消息告诉你的那样,你不能。 Array是一个结构,而不是一个类。您不能对结构实例有弱引用;它是一个值类型,因此它不执行weak
内存管理。
也不需要它 - 没有保留周期的危险,因为这是一种值类型。你应该问问自己为什么你认为它确实需要它。也许你认为weak
和Optional总是在一起,但他们没有。你已经宣布这是一个Optional数组;这肯定是足够的。
答案 2 :(得分:2)
您正尝试将weak
应用于Array
类型UIImageView
。 Array
是一个结构。