Swift。是否可以在运行时确定 属性 时间
Swift. Is it possible to determining property time at runtime
我有下一个问题:
我有一个 class,它可以包含一些不同类型的数据,但数据的类型在编译时是未知的。
看起来像这样
class Data {
var dataType: PodDataType = PodDataType.None
var componentsCount: UInt32 = 0
var stride: UInt32 = 0
var data // the data type of this field is unknown until dataType property is initialized
}
我还有另一个 class,它有多个数据实例,如下所示:
class Mesh {
var verticesCount: UInt32 = UInt32.max
var facesCount: UInt32 = UInt32.max
var UVWChannelsCount: UInt32 = UInt32.max
var vertexIndexes: Data?
var stripLength: UInt32 = UInt32.max
var stripsCount: UInt32 = UInt32.max
var vertex: Data?
var normals: Data?
var tangents: Data?
var binormals: Data?
// and so on ...
}
每次我创建一个新的数据对象时,它都应该在其 'data' 字段中包含不同的数据类型。解决此类问题的最佳方法是什么?
我的想法:
1) AbstractFactory 模式:我可以创建基础 class 数据和许多子 class 类型,如 DataInt、DataFloat 等,但这意味着我需要为每个支持类型创建子class(int32 , int8 和 15 类型)。
2) 泛型:我可以像这样定义数据 class 数据,但在那之后我的网格 class 变得依赖于数据 class 因为没有办法定义泛型class 没有类型参数。
3) UnsafePointer 我可以使用此指针存储数据,但我不确定如果我从中读取信息的 NSData 对象被释放,数据是否会保留。还有从 UnsafePointer 到实际类型的性能类型转换呢。
非常感谢任何其他针对这种情况的做法。
P.S。我正在为存储 3D 图形数据的 Pod 文件开发解析器。
可以找到 POD 文件格式规范 here 作为参考。
在 Swift 中,通常的做法是为每种类型制作一个 属性,并为每个实例使用一个。简单、安全、冗余度极低。
唯一可行的替代方法是找到一种可以描述您想要的所有数据类型的数据格式,例如String
。但是您将不得不投入时间来设计可靠的读写转换。显然,您必须为效率付出代价。
在我看来,您可以结合使用第一种和第二种方法。
使用具有具体 class 的抽象工厂模式,用于具有泛型的原始 class。它会让你的生活更轻松。
class BaseData {
}
class PrimitiveData<T> : BaseData {
}
class UserDefinedData : BaseData {
}
为什么不使用 Any
?:
class Data {
var dataType: PodDataType = PodDataType.None
var componentsCount: UInt32 = 0
var stride: UInt32 = 0
var data: Any?
}
但我认为这是 enum
with associated values:
的好用例
enum PodData {
case Ints([Int])
case Floats([Float])
// ...
case None
}
我有下一个问题:
我有一个 class,它可以包含一些不同类型的数据,但数据的类型在编译时是未知的。
看起来像这样
class Data {
var dataType: PodDataType = PodDataType.None
var componentsCount: UInt32 = 0
var stride: UInt32 = 0
var data // the data type of this field is unknown until dataType property is initialized
}
我还有另一个 class,它有多个数据实例,如下所示:
class Mesh {
var verticesCount: UInt32 = UInt32.max
var facesCount: UInt32 = UInt32.max
var UVWChannelsCount: UInt32 = UInt32.max
var vertexIndexes: Data?
var stripLength: UInt32 = UInt32.max
var stripsCount: UInt32 = UInt32.max
var vertex: Data?
var normals: Data?
var tangents: Data?
var binormals: Data?
// and so on ...
}
每次我创建一个新的数据对象时,它都应该在其 'data' 字段中包含不同的数据类型。解决此类问题的最佳方法是什么?
我的想法: 1) AbstractFactory 模式:我可以创建基础 class 数据和许多子 class 类型,如 DataInt、DataFloat 等,但这意味着我需要为每个支持类型创建子class(int32 , int8 和 15 类型)。
2) 泛型:我可以像这样定义数据 class 数据,但在那之后我的网格 class 变得依赖于数据 class 因为没有办法定义泛型class 没有类型参数。
3) UnsafePointer 我可以使用此指针存储数据,但我不确定如果我从中读取信息的 NSData 对象被释放,数据是否会保留。还有从 UnsafePointer 到实际类型的性能类型转换呢。
非常感谢任何其他针对这种情况的做法。
P.S。我正在为存储 3D 图形数据的 Pod 文件开发解析器。 可以找到 POD 文件格式规范 here 作为参考。
在 Swift 中,通常的做法是为每种类型制作一个 属性,并为每个实例使用一个。简单、安全、冗余度极低。
唯一可行的替代方法是找到一种可以描述您想要的所有数据类型的数据格式,例如String
。但是您将不得不投入时间来设计可靠的读写转换。显然,您必须为效率付出代价。
在我看来,您可以结合使用第一种和第二种方法。
使用具有具体 class 的抽象工厂模式,用于具有泛型的原始 class。它会让你的生活更轻松。
class BaseData {
}
class PrimitiveData<T> : BaseData {
}
class UserDefinedData : BaseData {
}
为什么不使用 Any
?:
class Data {
var dataType: PodDataType = PodDataType.None
var componentsCount: UInt32 = 0
var stride: UInt32 = 0
var data: Any?
}
但我认为这是 enum
with associated values:
enum PodData {
case Ints([Int])
case Floats([Float])
// ...
case None
}