为什么没有等效的Swift向视图添加动作?

时间:2018-06-23 22:49:29

标签: swift

环顾堆栈溢出,您会发现许多资源,这些资源包括如何向按钮添加操作,向视图添加操作等。这些资源中的每一个都使用function getInputSum(){ if ( $("#noteInput").checked ){ inputSum = reference .SumArray(refOctave[getRefOctave()]) .SumArray(refNote[getRefNote()]) .SumArray(refAccidental[getRefAccidental()]) .SumArray(autoOffsetToA) .SumArray(notes[getNote()]) .SumArray(chromatic[getChromatic()]) .SumArray(octave[getOctave()]) .SumArray(syntonic[getSyntonic()]) .SumArray(septimal[getSeptimal()]) .SumArray(undecimal[getUndecimal()]) .SumArray(tridecimal[getTridecimal()]) .SumArray(seventeen[getSeventeen()]) .SumArray(nineteen[getNineteen()]) .SumArray(twentyThree[getTwentyThree()]) .SumArray(twentyNine[getTwentyNine()]) .SumArray(thirtyOne[getThirtyOne()]); } else if ( $("#ratioInput").checked ){ smallestTerms = reduce(inputNum,inputDen); $("#num").text(smallestTerms[0]); $("#den").text(smallestTerms[1]); numArray = getArray(smallestTerms[0]); denArray = getArray(smallestTerms[1]); inputSum = reference .SumArray(refOctave[getRefOctave()]) .SumArray(refNote[getRefNote()]) .SumArray(refAccidental[getRefAccidental()]) .SumArray(numArray) .DiffArray(denArray); } } ,因为@objc#selectors代码。但是,我找不到一个资源,没有使用objc就向视图添加了动作。 将某些内容标记为objc会使它暴露于objc运行时,这在使用选择器时是必需的。

从本质上讲,归结为以下问题:

  • 是否可以在不使用Objective-C代码的情况下创建动作?
    • 如果是,为什么这么多资源使用@objc代码进行操作?
  • 如果不可能,为什么还没有做任何事情?
    • 为什么我们到达了Swift版本4,却没有等效的@objc来向视图添加动作?
    • 将来是否会有实现Swift变体的更新,以向视图添加动作?

1 个答案:

答案 0 :(得分:2)

目标/选择器机制是UIControl(和类似的类)在Objective-C甚至是物联网之前很早就被编写的方式。

您的问题对Objective-C同样有效。为什么UIControl(和类似名称)不提供基于块的API,而不提供过时的目标/选择器模式?

所以这不是更新Swift的问题。将基于块/闭包的API添加到使用目标/选择器模式的相关类中是一个问题。

如果您在GitHub上进行一些搜索,您会发现一个基于闭包的Swift API,它实际上可以实现您想要的。当然,它的实现是使用旧的目标/选择器API。