加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

你可以使用map来创建没有包装器的实例吗?

发布时间:2020-12-14 04:25:23 所属栏目:百科 来源:网络整理
导读:在 Python中,您可以将类的名称作为参数进行映射,以便创建该类的实例: class Point(object): def __init__(self,(x,y)): self.x = x self.y = ycoords = [(1.,2.),(3.,4.)]pts = map(Point,coords) 这经常被证明是一个方便的模式,所以我想在Swift中尝试相同
在 Python中,您可以将类的名称作为参数进行映射,以便创建该类的实例:

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)

……不,这很好.

我会很自然地承认我还没有花很多时间在swift上,所以我可能会在规范中遗漏一些禁止这个的东西.

是否可以使用map在swift中创建类/结构的新实例?

如果没有,为什么不呢?

>是因为init不是一个功能?
>在特定情况下,命名参数不能转换为位置参数吗?

解决方法

Swift 2更新:

归档错误有效!

在Swift 2中,现在可以使用coords.map(Point.init):

老答案:

  • is it because init is not a func?

是的.在Swift中,function type“由参数和由箭头( – >)分隔的返回类型”组成,并且map被定义为func map< U>(transform:(T) – > U) – > [U],即它具有功能.在the grammar,“功能声明”和“初始化声明”分别处理.后者没有返回类型,因为它实际上不是一个函数,只是用于初始化实例的代码块.如果您尝试传递Point.init,您将收到错误“无参数无法引用初始化程序”.

File a bug!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读