Swift中的构造函数?

时间:2018-11-08 23:07:46

标签: arrays swift

在Java中,我们可以使用构造函数来将初始值传递到类中。这可能很快吗?

例如,在下面的行中,我试图将一个对象添加到名为arrayOfMedia的数组中,该对象应包括在该函数内可以看到的所有值。

self.arrayOfMedia.append(Media().getUsersMedia(image: image!, postNum: anyPosts.key, userID: user))

但是我无法执行此操作,并在下面显示错误。

  

无法将类型'()'的值转换为预期的参数类型'媒体'

2 个答案:

答案 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) 
}