当前位置: 首页 > 面试题库 >

在Swift中使用协议时的类型转换

缪远航
2023-03-14
问题内容
protocol Test{

    var t: Int {set get}

}

struct A: Test{

    var t: Int

}

struct B: Test{

    var t: Int
    var s: String

}

let a = A(t: 1)
let b = B(t: 2, s: "1")

let c = a as Test

let d: [Test] = [a, b]

let e: [A] = [a, a]

let f = e as [Test]

let g = e as! [Test]

“让f = e为[测试],让g =
e为![测试]”总是会出错。我有一个必须发送[Test]到的功能。将A转换为Test易于使用。但是当涉及到数组时,我必须遍历所有数据。有什么好的方法可以将[A]转换为[Test]。


问题答案:

不同代码的答案是正确的,但它也是重要的是要明白,为什么你不能只是重新解释数据,而不 东西 做一个O(n)的转换行走,虽然在一个盒子包装的每个元素。

[A]是一个数组,元素大小为A。因此,或多或少A[1]都在内存位置A[0] + sizeof(A)(这不是完全正确,但假装是;它将使事情变得更简单)。

[Test]必须能够容纳符合协议的 任何内容 。可能是的大小A,可能是的大小B,后者更大。为此,它创建了一个包含“符合条件Test
的框。这个盒子的大小是已知的,它可能必须堆放它所指向的对象(或者可能不是;取决于),但是它的大小不会A和和相同B,因此[Test]内存中的布局必须与[A]或的布局不同[B]

现在as [Test]可以做O(n)为您走,然后立即强制复制。或将复制延迟到您第一次修改某项内容之前,但这会复杂得多,并且会将O(n)(可能是昂贵的,可能是内存分配)事件埋在一个内部as,感觉像应该是O(1)并且不分配内存。因此,有理由不这样做。

总有一天,他们可能会这样做,以使调用方的事情变得更简单,但是性能和复杂性都有代价,因此今天不这样做,您需要自己制作地图。

如果您想更深入地研究这些内容,并详细了解此框的工作方式(并且不要“假装比现在更简单”),请参阅WWDC
2016中的了解Swift性能。



 类似资料:
  • 问题内容: 在下面的代码中,我想测试是否为。如果是的话,我想作为。你怎么做到这一点?如果不使用强制转换,则使用其他技术。 那里的最后一行不会编译。错误是: 协议“ SpecialController”仅具有通用要求或关联类型要求,因此只能用作通用约束。 问题答案: 不幸的是,Swift当前不支持将具有关联类型的协议用作实际类型。但是,从技术上讲这对于编译器是可行的。并且很可能在该语言的未来版本中实

  • 问题内容: 我有一个协议,该协议继承自另一个协议,并且满足扩展要求。 还有另一种协议,其要求()应该为。 现在,如果我尝试使用as ,那么它将无法编译。它说, 推断的类型“地址”(通过匹配要求“ valueForDetail”)无效:不符合“ Validator”。 这种用法非法吗?我们不能像所有的那样用它代替。 下面是我正在尝试的代码。 更新: 提交了一个错误。 问题答案: David已经提到的

  • 问题内容: 我想创建一个具有某种类型并且也符合协议的属性,就像我在Objective-C中所做的那样: 我要寻找的是指定可以使用也符合CustomProtocol的UIViewController类型的对象设置属性,以便清楚什么是基类。我知道我可以只使用短类存根来获得相同的结果,即 但这似乎不是最干净的方法。 问题答案: 我想不出一种在Swift中表达这一点的好方法。类型的语法是: 类型→数组类型

  • 问题内容: 我正在将我的项目从Objective-c转换为Swift,并且正在使用一个Swift类,我正在尝试在Objective- c类中进行访问。我的问题是,在Objective-C类中不可访问。这是我的速成班: 当我查看文件时,看不到: 当我尝试在我的Objective-c类中使用时,出现编译器错误。 有人知道这个问题吗?如何在Objective-c中访问Swift协议? 问题答案: 您需要

  • 问题内容: 我对一方面用于协议的关联类型的语法和另一方面用于泛型类型的语法之间的区别感到困惑。 例如,在Swift中,可以使用以下方式定义通用类型 而使用诸如 为什么后者不只是: 是否有某种深层的原因(或者也许是显而易见的,对我来说就迷失了),原因是该语言未采用后一种语法? 问题答案: 在开发人员列表中已对此进行了多次讨论。基本答案是关联类型比类型参数更灵活。虽然您在这里有一个类型参数的特定情况,

  • 我尝试将名为的Swift协议导入到名为的Objective-C类中。 我从一个现有的Objective-C项目开始(我没有用xCode创建一个新的Swift项目,也没有发现如何在Xcode6中将我的Objective-C项目配置为一个Swift项目)。 在Apple文档中,他们说我必须在我的文件中包含名为的文件。但我不需要将其包含在文件中,而是包含在中。这会有问题吗? 当我尝试编译时,出现以下错误