Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将变量分配给函数-Swift 3_Swift_Xcode_Swift3 - Fatal编程技术网

将变量分配给函数-Swift 3

将变量分配给函数-Swift 3,swift,xcode,swift3,Swift,Xcode,Swift3,如何将函数分配给变量,然后根据结果执行操作?我用的是xcode 10 class ViewController: UIViewController { func foo(bar: Int = 10) -> Int { return 1 } var demo = foo(bar: Int = 1) // cannot assign immutable expression... var test = 10 let result = demo - test

如何将函数分配给变量,然后根据结果执行操作?我用的是xcode 10

class ViewController: UIViewController {

  func foo(bar: Int = 10) -> Int {

   return 1

  }

  var demo = foo(bar: Int = 1) // cannot assign immutable expression...
  var test = 10

  let result = demo - test
}
我希望
结果
等于
9

demo
is
时出现错误,无法在属性初始值设定项中使用实例成员foo;属性初始值设定项在self…之前运行。


免责声明:我是swift新手;来自ruby。

您的语法有点混乱

  • 在func签名中添加下划线以提高可读性
  • 要覆盖默认值时,仅传入变量
  • 将此示例函数重新编码为而不是始终返回1,但返回传递给它的内容(或默认值)

编辑:实际问题在上面修复的错误中丢失。OP将使foo(条:)成为计算属性。因此,最终的解决办法是:

var _foo:Int = 10
var foo:Int {
    get {
        return _foo
    }
    set {
        _foo = newValue
    }
}
在viewDidLoad()中测试:

请注意:

  • 不能对计算属性执行类似“常量默认值”的操作。因为这是一个实例属性,所以只能设置一次
  • 不能将函数转换为属性。是的,函数在Swift中是一流的公民,但这只意味着可以通过将它们传递到另一个函数中“将它们当作变量对待”
  • 我尝试了一些变体(将“=10”添加到声明中,使Int成为可选的,从东西中删除get,它要么不构建,要么崩溃

如果您确实需要默认值为10,计算传递到事物中的内容,并使其在全球范围内可用,我建议重构您的概念以使用这些解决方案中的一种或另一种。

以下是一些语法可能性,具体取决于您需要代码执行的操作:

var test = 10

// Simple value
let demo = foo(bar: 1)
let result = demo - test

// Closure calling function
let demo2 = { foo(bar: 1) }
let result2 = demo2() - test

// Pointer to function
let demo3 = foo
let result3 = demo3(1) - test

是的,但我收到一个错误,我不明白:
不能在属性初始值设定项中使用实例成员foo;属性初始值设定项在self之前运行…
您需要添加更多的代码。听起来您编写的代码与您发布的代码不同。(1)foo在属性中吗?特定类?枚举?(2)如果在一个类中,什么是初始值设定项?(3)事实上,是什么初始值设定项引起了这个错误?@Sylar请用关于这个错误的附加上下文更新你的问题。我在
UIViewController
sorry.Ok.所以如果你不在操场上,我相信如果你(1)把我的foo()作为“原始”函数放在那个视图控制器中,(2)将我的调用放在**viewdiload()-super.viewdiload()-**之后,然后查看结果,事情应该会生成并运行。这就是我要求更多代码的意思。你必须将foo()放在其他地方。1-10是-9,而不是9。@我是正确的,但这不是问题所在。请参阅错误。OP(以及你现在拥有的代码)“demo”声明中有错误。请删除该行中的“Int=”部分。这将始终产生所述错误,这与您在我的回答中评论的错误不同。
print(foo)  // prints 10
foo = 1
print(foo)  // prints 1
var test = 10

// Simple value
let demo = foo(bar: 1)
let result = demo - test

// Closure calling function
let demo2 = { foo(bar: 1) }
let result2 = demo2() - test

// Pointer to function
let demo3 = foo
let result3 = demo3(1) - test