我可以在协议中使用@IBOutlets(Swift)

时间:2017-12-14 16:56:13

标签: swift protocols iboutlet

我有一个以下列方式定义的小协议:

import UIKit

protocol HasMeterAnimation {
    func animateMeter(scrollableView: UIScrollView)
}

它的实现需要使用IBOutlets:

func animateMeter(scrollableView: UIScrollView) {

    let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y
    let progressBarRect = self.progressBar.frame
    let rectOfProgressBarInParentView =  self.convert(progressBarRect, to: scrollableView.superview)
    let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height

    if maxYPosTableview > maxYPosMeter {
        if progressBar.isHidden == false {
            progressBar.animateProgressBar()
            model.shouldMeterAnimate = false
        }
    }
}

如果有办法让我使用IBOutlets在协议扩展中编写此实现,我想知道...这样的事情:

    protocol HasMeterAnimation {

        @IBOutlet var progressBar:AnimatedProgressBar! { get set }
        var model: ListItem! { get set }

        func animateMeter(scrollableView: UIScrollView)
    }

extension HasMeterAnimation {

            func animateMeter(scrollableView: UIScrollView) {

                let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y
                let progressBarRect = self.progressBar.frame
                let rectOfProgressBarInParentView =  self.convert(progressBarRect, to: scrollableView.superview)
                let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height

                if maxYPosTableview > maxYPosMeter {
                    if progressBar.isHidden == false {
                        progressBar.animateProgressBar()
                        model.shouldMeterAnimate = false
                    }
                }
            }

我尝试了很多方法,但一直给我错误。感谢

1 个答案:

答案 0 :(得分:3)

IBOutlet只是一个关键字,让界面构建器知道您希望从类中的界面构建器引用对象,例如在ViewController,View等中。在任何其他上下文中,IBOutlet没有任何意义。在协议中定义属性时,也不要将它们标记为强制解包。如果您没有明确将属性标记为可选属性,则该属性必须在运行时具有值,否则您无法编译代码。界面构建器将其出口标记为强制解包,因为它们在编译时没有值并且在运行时被解析。