function - 有没有办法引用类型的构造函数?

标签 function swift constructor

在 Swift 中,您可以引用一个函数,为其分配一个值,然后在以后使用它。我们都知道。但我想知道我们是否可以使用初始化器来做到这一点。这是一些示例代码。假设我有一个 User 结构:

struct User {
    let name: String
    let age: UInt

    init(name: String) {
        self.name = name
        age = 0
    }
}

我有一个名字数组

let names = ["Cooper", "Murph", "Brand", "Dr. Mann"]

我想将这些名称映射到 User 实例。我可以这样做:

let users = map(names, { User(name: $0) })

虽然这看起来不错,但我觉得使用 map 函数采用的闭包是不必要的。我的意思是它基本上需要一个名称并生成User。但我们在 User 结构的构造函数中定义了它。为什么我们需要重复它?有没有办法将构造函数作为函数获取并将其直接传递给 map 函数?

最佳答案

简短回答:不,您不能将 init 作为独立函数进行引用。不过这样就很好了。

可以像这样访问成员函数:

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

// will be a function that takes a User object,
// and returns a new function that is getName
// called on that object:
let f = User.getName

let u = User("Fred")

// g will be a function that calls getName on u
let g = f(u)
g()  // returns "Fred"

如果User是一个类而不是一个结构,您也可以这样做:

// h will be equivalent to g above...
let h = u.getName
h()  // returns "Fred"

调用 init 感觉应该更像后者,因为它创建新的对象而不是获取现有的对象。 User.init 应该返回一个函数,该函数接受一个名称并返回一个 User (尽管您有两个初始值设定项,因此您需要提供一些类型上下文)。但 Swift 不会让你这样做(告诉你“没有参数就不能引用初始化器”)。

一件有趣的事情是协议(protocol)可能需要某些类型的初始化程序,因此您可以执行以下(相当愚蠢)的操作来伪造一个初始化任何类型的函数,仅供娱乐而不是实际使用:

protocol StringInitializable {
    init(_ s: String)
}

// no implementation needed as User already conforms
extension User: StringInitializable { }

func initerFromString<T: StringInitializable>(s: String) -> T {
    return T(s)
}

let users: [User] = map(names, initerFromString)

上面使用 users 数组的类型修复了类型,但您可以通过修复函数的类型来实现:

let userInit: String->User = initerFromString

let moreUsers = map(names, userInit)

struct Monster: StringInitializable {
    let name: String
    init(_ name: String) { self.name = name }
}

let monsterInit: String->Monster = initerFromString

let monsters = map(names, monsterInit)

(实际上用于实际效果的地方是在ExtensibleCollectionType中)

关于function - 有没有办法引用类型的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766386/

相关文章:

swift - 通过perform crasher调用#selector @objc函数

c++ - 如何从复制构造函数委托(delegate)到通用复制构造函数模板?

c++ - 通过 C++ 中的构造函数将地址参数传递给基类指针

c++ - 编译器将 cpu 寄存器中的这种结构传递给函数是否有意义?

python - 值在函数中正确打印,但返回时为 None

c++ - 获取模板函数类型

swift - 将 FLEX 与 Swift 项目结合使用

ios - 快速引用数组的通用变量

c - 如何从 C 中的 char 函数返回字符串

c++ - 在 C++ 中使用初始化列表初始化数据成员引用