【问题标题】:How to declare a property as a function in Swift?如何在 Swift 中将属性声明为函数?
【发布时间】:2015-09-24 23:19:30
【问题描述】:

这是我的代码:

import Cocoa

class VC1: NSViewController {
    let aFunctionVar ()->Void
}

然而编译器告诉我:“类 VC1 没有初始化器”

根据 Apple Swift iBook 中的 swift 示例,他们的示例如下:

var mathFunction: (Int, Int) -> Int = addTwoInts

但就我而言,我正在尝试创建一个属性变量。目前还不知道变量是什么,所以我不能在那里设置它。有什么帮助吗?

编辑 - 当涉及到简单的字符串/数组/字典类型等时,我已经知道如何使变量成为可选和惰性的。但这是一个函数类型的属性变量。它旨在保存()->Void 类型的函数。关于如何做到这一点的任何帮助?

在 ObjectiveC 中,这可以通过创建如下的块属性来完成:

@property (nonatomic, copy)  void (^aFunctionVar)();

【问题讨论】:

  • 使其成为可选变量。
  • 如何使它成为可选变量?在末尾添加? 会给我同样的错误
  • 你试过( ( )->Void )? 吗?
  • 除了“?”之外,您是否还使用了“var”关键字? ?
  • -____- 谢谢大家.. 我认为添加一个问号(不带括号)使其成为可选

标签: objective-c swift closures objective-c-blocks


【解决方案1】:

projectLaunchData 声明为可选的var

import Cocoa

class VC1: NSViewController {
    var projectLaunchData: (()->Void)?
}

然后你可以稍后赋值:

func test() {
    print("this works")
}

let myVC = VC1()

// assign the function
myVC.projectLaunchData = test

// Call the function using optional chaining.  This will safely do nothing
// if projectLaunchData is nil, and call the function if it has been assigned.
// If the function returns a value, it will then be optional because it was
// called with the optional chaining syntax.
myVC.projectLaunchData?()

【讨论】:

  • 非常感谢.. 我没有意识到我必须将它包含在 ()
  • 不客气。您需要将其括在括号中,以便 Swift 知道整个函数是可选的,而不仅仅是返回值。
【解决方案2】:

如果在设置对象后知道该值,则可以使用惰性变量:

class LazyTester {
    lazy var someLazyString: String = {
       return "So sleepy"
    }()
}
var myLazyTester = LazyTester()
myLazyTester.someLazyString

编译器给你这个错误是因为你定义了一个强制存储变量projectLaunchData,但没有给它一个值。如果你知道初始化时的变量值,你可以在初始化时设置它。

【讨论】:

  • 使用普通变量制作惰性 var 作品。这我知道该怎么做。但这不是一个简单的 String 类型变量。它是函数类型变量。我如何使上面的变量变得懒惰?
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多