Swift引用属性并传递它

时间:2015-10-31 08:55:33

标签: swift

如何将属性引用分配给变量并传递给它。类似于函数的东西,我们可以做这样的事情:

class Foo {

    func executeTask() {
        print("executeTask called")
    }

    var name: String = "name1"
}

// get reference to the executeTask method
let x = Foo.executeTask

// later we can call the executeTask method but using the x variable
x(Foo())()

但我们怎样才能为财产做同样的事情。我原以为:

// get reference to the executeTask method
let y = Foo.name

// later we can call name property but using the y variable
y(Foo())()

但这会产生错误:instance member 'name' cannot be used on type 'Foo'

编辑: 大家好,问题绝不是要访问实例变量的属性来获取其当前值。这是一个微不足道的问题。 再看一下executeTask示例。 executeTask被定义为func executeTask()因此示例中的x是对函数的引用。我想要一个非常类似的东西来获取属性,我可以稍后调用以获取属性的值,请不要告诉我使用Container类。

编辑2: 用一个更好的例子来解释。

4 个答案:

答案 0 :(得分:5)

一个函数可以用作一个闭包,一个属性可以用来实现 解决方案是添加自定义函数来访问属性,没有直接的方法。

class Foo {

  var name: String = "name1"

  func getName() -> String {
    return name
  }
}

let y = Foo.getName
y( Foo() )()

答案 1 :(得分:3)

KeyPath可能与您要求的不完全相同,但可能足够接近

let y = \Foo.name
let z = Foo()
z[keyPath: y]

有关更多信息,请参见:https://developer.apple.com/documentation/swift/keypath https://developer.apple.com/videos/play/wwdc2017/212/

答案 2 :(得分:-3)

如果您想稍后更改该属性,则应向您的班级添加新的attribute,例如:

class ViewController: UIViewController {
    var scrollView:UIScrollView!

...
}

然后您可以像这样访问和更改它:

scrollView.contentSize = bigRect.size

有关更多信息,请查看this answer

答案 3 :(得分:-4)

class C {
    var p : String = "p"
    func f() {}
}

let f = C.f     // C->()->()
//let p = C.p   // error

protocol P {
    func f()
}
// let p = P.f  // Segmentation fault: 11

这不是一个答案,只是一个实验。