C+的Swift等价物+;指针/引用约定? C++作为一个C++的DeV拾取Swift,我想知道,在一个结构或其他类中,如何将一个“指针”或“引用”存储到另一个类的另一个对象的属性。

C+的Swift等价物+;指针/引用约定? C++作为一个C++的DeV拾取Swift,我想知道,在一个结构或其他类中,如何将一个“指针”或“引用”存储到另一个类的另一个对象的属性。,swift,pointers,pass-by-reference,Swift,Pointers,Pass By Reference,例如,一个controlResponder类(或结构),它侦听事件以修改effect类中目标的值target 控制响应者: struct controlResponder { var ccNum : Int! // CC number to respond to var target : Double! // Points to the variable of another object var min : Double! var max : Double!

例如,一个
controlResponder
类(或结构),它侦听事件以修改
effect
类中目标的值
target

控制响应者:

struct controlResponder {
    var ccNum : Int!  // CC number to respond to
    var target : Double! // Points to the variable of another object
    var min : Double!
    var max : Double!
}
在我的例子中,效果可以是不同的类别,但修改的目标始终是一个
Double
(确切地说,我正在使用AudioKit,目标是
AKVariableDelay.time
,或
AKMoogLadderFilter.cutoff

如有任何见解,将不胜感激,谢谢

以下是我的一些实际(不起作用)代码的节略版本:


在Swift中,唯一可以可靠存储的指针是分配给的指针。你可以从操作员的地址得到的指针是作弊的,它们只在短时间内有效;超过这一点使用它们将产生不可预测的结果

这意味着,一般来说,不能将指针存储到一个值类型(Stult实例)中,它被分配为“”(从C++术语借用)。如果需要共享值类型,则需要在某种方便的级别将它们包装到引用类型(

class
instances)中


最通用的方法是使用一对闭包,一个用于返回值,另一个用于设置值。但是,对于你的特定情况,可能有一个不太通用但更有用的方法。如果问题不是关于C++本身的,请留下标签。你要问的是如何说<代码> var目标=?一些语法>响应器。目标< /代码>然后<代码>目标=0.5 < /代码>,使得原来的“响应者”。“的属性值改变了吗?@JoshCaswell本质上是的!这个“Effect”类将接收一个事件,我想存储一个数组映射,这样事件的传入值将修改另一个对象中属性的实际值。如果您使用的是Swift 4,关键路径应该可以做到这一点。啊!因此,如果在上面的代码中,我要使ccListener成为一个类而不是一个结构,如果我初始化一个类并传递,比如说,
让newListener=ccListener(target:self.effect.cutoff)
(一个double)作为初始化参数,那么它实际上是一个引用,而不仅仅是一个double值?@EricR,您是否了解,
class
init
参数由于
class
是引用类型而成为引用?如果是这样,那不是我的意思,事实也不是这样<代码> NeXisteleN/CODE >将是一个引用(更像是一个C++指针,我猜),但是它的<代码>目标< /代码>仍然是一个自动存储的值。您仍然无法创建指向具有自动存储功能的值的长期指针,但您可以与其他组件共享
newListener
引用,以便它们可以在右侧工作,共享
Double
import Foundation
import AudioKit
import SwiftyJSON

class Effect : AKNode, AKMIDIListener {

  enum CustomError: Error {
    case badEffectName
  }

  struct ccListener {
    var ccNum : Int!
    var target : Int!
    var min : Double!
    var max : Double!
  }

  var listeners : [ccListener]

  var effectType = ""
  var effect = AKNode()
  var channel = 0
  var midi : AKMIDI

  init(connectionInput : AKNode, midi : AKMIDI, subJson : JSON, channel : Int) throws {

    self.midi = midi
    self.channel = channel
    var insertType = subJson["type"]

    if insertType == "distortion" {
      print("Adding a DISTORTION")
      effect = AKTanhDistortion(connectionInput)

      if let efx = effect as? AKTanhDistortion {
        let gainVal = random(subJson["gain random low"].doubleValue, subJson["gain random high"].doubleValue)
        print("gainVal: \(gainVal)")
        efx.pregain = gainVal
      }

    }
    else if insertType == "moog" {

      print("Adding a MOOG FILTER")
      /// CUTOFF
      let cutoffVal = random(subJson["cutoff random low"].doubleValue, subJson["cutoff random high"].doubleValue)
      print("cutoffVal: \(cutoffVal)")
      /// RESONANCE
      let resonanceVal = random(subJson["resonance random low"].doubleValue, subJson["resonance random high"].doubleValue)
      print("resonanceVal: \(resonanceVal)")

      effect = AKMoogLadder(connectionInput,
        cutoffFrequency: cutoffVal,
        resonance: resonanceVal)
    }
    else {
      print("BAD EFFECT TYPE: \(insertType)")
      throw CustomError.badEffectName
    }

    /////// MIDIZ

    midi.openInput("vIn")

    super.init()

    for (key, cc) in subJson["ccs"] as JSON {
      let efx = effect as! AKMoogLadder
      listeners.append(ccListener(ccNum: cc["cc number"].intValue, target: efx.cutoffFrequency, min: cc["min"].doubleValue, max: cc["max"].doubleValue))
    }

    midi.addListener(self)
    print("End of Effect init()")
  }


  func receivedMIDIController(_ controller: MIDIByte, value: MIDIByte, channel: MIDIChannel) {
    print("Self channel: \(self.channel), incoming channel: \(Int(channel))")
      if self.channel == Int(channel){
        print("Effect got a CC!")
      }
    }

    func changeVal(ccNum: Int, newValue: Int) {

      for listener in listeners {
        if listener.ccNum == ccNum {
          listener.target = newValue
        }
      }

    }

  }