- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!