swift:将函数类型分配给变量

标签 swift function types

    struct System {
        var method: (() -> ())?
        var curMethod: Int

        init() {
            method = nil
curMethod = 0
        }

        mutating func method1() {
            curMethod = 1
        }

        mutating func method2() {
            curMethod = 2
        }
    }

    var sys = System()
    sys.method = System.method1
    sys.method!()

我收到一个错误,无法将类型 (inout System) -> () -> ()' 的值分配给类型 '(() -> ())?。我做错了什么?

最佳答案

首先,您的行 sys.method = System.method1 是错误的,因为它要求 method1 是静态函数(如类函数)而不是而不是实例函数,因此应将其更改为 sys.method = sys.method1。但这是不允许的——错误是“错误:不允许部分应用‘变异’方法”。

如果将 System 设为类(而不是结构),则将 System.method1 替换为 sys.method1 即可>.

这样做的原因是 mutating func 实际上不仅仅是一个简单的底层函数——它是一个柯里化(Currying)函数(用编译器生成的函数柯里化(Currying)),有效地创建一个具有"new"值的结构的新副本 - 因此,您 A) 不能直接访问它(“不允许部分应用程序”)和 B)您不能将它分配给 ()->() 变量。

关于swift:将函数类型分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590478/

相关文章:

ios - 通过 Parse.com 下载将 NSData 转换为 UIImage 时出现问题

ios - 自动居中以编程方式创建的 UIButtons

mysql - 使用函数的 SQL VIEW (phpMyadmin)

c++ - 是否必须在同一个文件中声明 C++ 内联函数?

c - C 中的函数式编程(柯里化(Currying))/类型问题

swift - 在时间范围内查找时间段的最佳方法

c - C语言中的函数

javascript - 如何在类上实现类型?

java - 使用 Java Guava 库,如何使用 Builder 创建 ImmutableSortedSet?

ios - 如何在swift中定期清除NSCache?