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

在Swift中将不同类型的值存储在Array中

宁飞宇
2023-03-14
问题内容

在Swift编程语言中,它说“一个数组在一个有序列表中存储相同类型的多个值”。但是我发现您可以在数组中存储多种类型的值。描述不正确吗?

例如

var test = ["a", "b", true, "hi", 1]

问题答案:

来自REPL

 xcrun swift
  1> import Foundation
  2> var test = ["a", "b", true, "hi", 1]
test: __NSArrayI = @"5 objects" {
  [0] = "a"
  [1] = "b"
  [2] =
  [3] = "hi"
  [4] = (long)1
}
  3>

您可以看到的testNSArray,这是AnyObject[]NSObject[]

发生的事情是Foundation提供了将数字和布尔值转换为的能力NSNumber。需要编译代码时,编译器将执行转换。

因此,它们现在具有的通用类型,NSObject因此可以推断为NSArray

没有,您的代码将无法在REPL中编译import Foundation

 var test = ["a", "b", true, "hi", 1]
<REPL>:1:12: error: cannot convert the expression's type 'Array' to type 'ArrayLiteralConvertible'
 var test:Array = ["a", "b", true, "hi", 1]
<REPL>:4:18: error: cannot convert the expression's type 'Array' to type 'ExtendedGraphemeClusterLiteralConvertible'

但是你可以做到

var test : Any[] = ["a", "b", true, "hi", 1]

因为它们具有通用类型,即Any

注意:AnyObject[]不能使用import Foundation

var test:AnyObject[] = ["a", "b", true, "hi", 1]
<REPL>:2:24: error: type 'Bool' does not conform to protocol 'AnyObject'


 类似资料:
  • 问题内容: 我想将元素存储在一个列表中,每个元素具有4个参数,我试图创建一个数组列表,该列表为每个元素存储4个参数,它们是不同类型的: iD:int x位置:浮点 y位置:浮点 名称:字符串 我用: 但是当我使用时: 我得到错误: “ ArrayList类型的add(int,Object)方法不适用于参数(in,float,float)” 我不知道如何能够向ArrayList添加不同类型,有没有办

  • 问题内容: 我想在[String:SomeClass]类型的Dictionary中存储一个更专业的类型。这是一些说明我的问题的示例代码(也可以在https://swiftlang.ng.bluemix.net/#/repl/579756cf9966ba6275fc794a上使用): 它产生错误。 我已经尝试过强制转换,但是会产生错误。 我也尝试将Dictionary定义为type,但这也没有任何改

  • 问题内容: 我有两个不同的数组,一个带有字符串,另一个带有整数。我想将它们连接成一个数组,其中每一列都具有原始数据类型。我当前执行此操作的解决方案(请参见下文)将整个数组转换为dtype = string,这似乎在内存方面效率很低。 何时和何时可能使dtypes多元化? 问题答案: 一种方法可能是使用记录数组。“列”与标准numpy数组的列不同,但是对于大多数用例来说,这就足够了: 请注意,您还可

  • 问题内容: 我有一个像这样的文件: 然后在另一个文件中,我有: 然后在另一个文件中,我有: 但这给了我这个错误: Foo不是类型 我可能做错了很多。我想做的是将所有处理程序存储在AllHandlers结构中,但不确定如何执行此操作。 我相信可以这样简化问题: 上面的代码不会编译,主要是因为据我所知,您将返回类型而不是值-例如,使用Class而不是该Class的实例。我该如何进行编译? 参见以下示例

  • 问题内容: 我正在尝试开发一种通用的表加载器,其架构在运行时是已知的。这需要具有包含不同类型的元素的列表,并支持各种get和诸如集方法的类,,。元素我考虑的类型有,,,和,和。每个元素的实际类型在运行时都是已知的,我将它们存储在一个List中,描述其架构以进行进一步处理。 我的问题是:我应该在或中存储这样的元素列表吗?还是有更好的方法来实现此类? 问题答案: 由于您的类的共同祖先是,并且由于不会使

  • 在Swift中,有人能解释一下如何用从原始属性子类的另一个对象重写超类的属性吗? 如果将底盘改为“var”,则会出现错误: 我在指南中“重写属性”下找到的唯一东西表明,我们必须重写getter和setter,这可能用于更改属性的值(如果它是'var'),但更改属性类怎么办?