swift中的弱点在objective-C头文件中消失

时间:2017-01-11 04:55:36

标签: objective-c swift

所以我们有一个swift库,我们在基于Objective-C的项目中使用它。

在swift中,有一个这样的类:

/// Base class for all axes
@objc(ChartAxisBase)
open class AxisBase: ComponentBase
{
    public override init()
    {
        super.init()
    }

    /// Custom formatter that is used instead of the auto-formatter if set
    weak fileprivate var _axisValueFormatter: IAxisValueFormatter?


    /// Sets the formatter to be used for formatting the axis labels.
    /// If no formatter is set, the chart will automatically determine a reasonable formatting (concerning decimals) for all the values that are drawn inside the chart.
    /// Use `nil` to use the formatter calculated by the chart.
    open var valueFormatter: IAxisValueFormatter?
    {
        get
        {
            if _axisValueFormatter == nil ||
                (_axisValueFormatter is DefaultAxisValueFormatter &&
                    (_axisValueFormatter as! DefaultAxisValueFormatter).hasAutoDecimals &&
                    (_axisValueFormatter as! DefaultAxisValueFormatter).decimals != decimals)
            {
                let df = DefaultAxisValueFormatter(decimals: decimals)
                _axisValueFormatter = df
                NSLog("found nil vf, assigning to \(_axisValueFormatter)")
            }
            NSLog("returning \(_axisValueFormatter)")
            return _axisValueFormatter
        }
        set
        {
            _axisValueFormatter = newValue //?? DefaultAxisValueFormatter(decimals: decimals)
        }
    }
    ...
}

如您所见,有一个私有变量声明为弱:

  

weak fileprivate var _axisValueFormatter:IAxisValueFormatter?

并且valueFormatter有一个getter和setter。

但是,最新的Xcode 8.2.1将为valueFormatter生成一个Objective-C标头,如:

  

@property(非原子,强)id _Nullable valueFormatter;

正如您所看到的,它很强大,我也可以在头文件中找到任何_axisValueFormatter

这是预期的吗?我怎么能做对的?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您已将valueFormatter定义为强属性。 _axisValueFormatter定义为fileprivate,因此无法从外部访问。所以一切都如预期的那样。

总结:

  1. _axisValueFormatter将保持弱势。
  2. valueFormatter的存储修饰符无关紧要,因为内部实施依赖弱私有财产_axisValueFormatter
  3. 您声称valueFormatter很强,但之后您使用weak属性支持它,该属性可以随时变为零。这是一种副作用的财产。我建议避免这种情况,只需将valueFormatter标记为weak即可调整对使用您的课程的开发人员的期望。

    查看关于弱引用和强引用的文档:

    https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID48