【问题标题】:Changing the initial value of a var in another module在另一个模块中更改 var 的初始值
【发布时间】:2016-10-25 11:52:08
【问题描述】:

我正在使用这个模块来显示图像: https://github.com/huynguyencong/ImageScrollView/blob/master/Sources/ImageScrollView.swift

我已使用 CocoaPods 将它添加到我的项目中,并且我想更改 var "maxScaleFromMinScale" 的值。我就是想不通。

首先我试图覆盖 var 这是不可能的。

然后我尝试通过复制和覆盖由模块创建者覆盖的相同初始化器来覆盖初始化器。

override init(frame: CGRect) {
    super.init(frame: frame)
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

这不起作用,它在顶部初始化程序上给我一个错误,说我没有覆盖指定的初始化程序。感觉就像我无法覆盖它,因为它不像第二个那样公开。对吗?

我尝试的最后一件事是进行扩展:

extension ImageScrollView {
    public func setMaxScale(scale: CGFloat) {
        maxScaleFromMinScale = scale
    }
}

这也不起作用,maxScaleFromMinScale 是一个未解析的标识符。这似乎也是因为它是一个内部变量,我无权访问它(另一个模块)。这是否意味着我唯一的选择是复制整个文件并修改源。希望有一个最小而优雅的解决方案。

如果是这样,为什么你可以覆盖内置的 UIKit 元素,而不是我使用 CocoaPods 下载的这个元素。

【问题讨论】:

    标签: swift module overriding var initializer


    【解决方案1】:

    转到 pod 文件并解锁文件(它会在编辑时提示这样做),然后更改

    var maxScaleFromMinScale: CGFloat = 3.0
    

    public var maxScaleFromMinScale: CGFloat = 3.0
    

    【讨论】:

    • 你也可以使用“静态”。
    • “解锁”是什么意思。我该怎么做?
    • 就像我说的它会提示编辑,如果没有,您可以将变量公开。
    • @Alex他的意思是直接在本地编辑pod的源代码。但实际上你不应该那样做。相反,如果您正在应用修改,请克隆 pod。
    【解决方案2】:

    是的,您不能覆盖变量/函数,因为它是 internal。这就是访问修饰符的意义所在。

    某些UIKit 函数是public,因此您可以覆盖它们。

    【讨论】:

    • 所以基本上,在使用模块时,如果需要更改代码中的某些内容,您必须做“愚蠢”的事情并复制整个内容?
    • @Alex 是的。如果不是public,那么它不会被覆盖。
    猜你喜欢
    • 2017-07-25
    • 2019-04-03
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2019-11-29
    相关资源
    最近更新 更多