在Python中,您可以将类的名称作为参数提供给map
,以便创建该类的实例:
class Point(object):
def __init__(self, (x, y)):
self.x = x
self.y = y
coords = [(1., 2.), (3., 4.)]
pts = map(Point, coords)
这经常被证明是一个方便的模式,所以我想在Swift中尝试相同的事情。
首先,我们设置了Point
类:
import Cocoa
class Point
{
var x: Float
var y: Float
init(x: Float, y: Float) {
self.x = x
self.y = y
}
}
var pt = Point(x: 1, y: 2) // works fine
但是当我们尝试使用.map
创建实例时,我们会收到错误:
let coords: (Float,Float)[] = [(1, 2), (3, 4)]
// (Point).Type is not convertible to '(Float, Float) -> $T3'
var pts = coords.map(Point)
// Initializer cannot be referenced without arguments
var pts = coords.map(Point.init)
对我来说有趣的是,如果我们首先定义一个包装函数,那么 可以工作:
func wrapper(x: Float, y: Float) -> Point {
return Point(x: x, y: y)
}
// This *is* successful
var ptsWrapped = coords.map(wrapper)
好的,现在我很好奇这是否禁止在方法上使用map
:
extension Point {
func newPointByAdding(x: Float, y: Float) -> Point {
return Point(x: self.x + x, y: self.y + y)
}
}
// This works as expected
var origin = Point(x: 0, y: 0)
var ptsAdded = coords.map(origin.newPointByAdding)
......不,这很好。
我会自由地承认我还没有花很多时间快速处理,所以我可能会在规范中遗漏一些禁止此事的内容。
是否可以使用map
在swift中创建类/结构的新实例?
如果没有,为什么不呢?
init
不是func
?答案 0 :(得分:5)
提交错误有效!
在Swift 2中,现在可以使用coords.map(Point.init)
:
旧答案:
- 是因为init不是func?
是的。在Swift中,function type“由参数和返回类型组成,由箭头(->
)”分隔,map
定义为func map<U>(transform: (T) -> U) -> [U]
,即它包含功能。在the grammar中,“函数声明”和“初始化器声明”分别处理。后者没有返回类型,因为它实际上不是一个函数,只是用于初始化实例的代码块。如果您尝试传递Point.init
,您将收到错误“无参数无法引用初始化程序”。
答案 1 :(得分:2)
现在可以在Xcode 7.0 beta 2
中使用 来自release notes 的
现在可以通过引用将静态方法引用为静态方法 .init在静态类型引用或类型对象上:
let x = String.init(5) let stringType = String.self let y = stringType.init(5) let oneTwoThree = [1, 2, 3].map(String.init).reduce(“”, combine: +)
答案 2 :(得分:0)
我认为你的结论是正确的:init
不被视为传统的功能。您可能想将此报告为错误;我不确定这是否是预期的行为。
coords.map{ p => Point(x: p[0], y: p[1]) }