在Java中,我们可以使用构造函数来将初始值传递到类中。这可能很快吗?
例如,在下面的行中,我试图将一个对象添加到名为arrayOfMedia的数组中,该对象应包括在该函数内可以看到的所有值。
self.arrayOfMedia.append(Media().getUsersMedia(image: image!, postNum: anyPosts.key, userID: user))
但是我无法执行此操作,并在下面显示错误。
无法将类型'()'的值转换为预期的参数类型'媒体'
答案 0 :(得分:3)
随着类的值变化(有时是视频,有时是图像),我也不必初始化类。
好的,这没有任何意义,您有一个class
,它是一些数据的容器,其中一些是可选的(您有图像或视频),为什么不为它们提供两个不同的初始化程序两种不同的用例……就像您在Java中一样?
您可以通过多种方式实现这一目标,这只是其中一种...
class Media {
var image: UIImage?
var video: Data?
let postKey: Int
let userId: Int
internal required init(postKey: Int, userId: Int) {
self.postKey = postKey
self.userId = userId
}
convenience init(image: UIImage, postKey: Int, userId: Int) {
self.init(postKey: postKey, userId: userId)
self.image = image
}
convenience init(video: Data, postKey: Int, userId: Int) {
self.init(postKey: postKey, userId: userId)
self.video = video
}
}
另外,请注意,您只需提供一个初始化程序,就像...
init(image: UIImage? = nil, video: Data? = nil, postKey: Int, userId: Int) {...}
但这不会限制用户使用一种或另一种类型(他们仍然可以为两个值传递nil
)
另一种方法可能是利用protocol
来描述Media
的基本/通用属性,然后实施不同的要求(直接称为struct
或{{1} } s或间接作为其他class
)
例如...
protocols
答案 1 :(得分:1)
对于它的价值,在这种情况下,我将使用枚举来包装您的媒体类型。
from ..filters import equalizer
然后您就可以进行类型安全访问了,而无需选择:
enum MediaType {
case image(UIImage)
case video(Data)
}