C# has a neat feature,您可以使用解构来修饰您的自定义类型,以允许它们自动解构为元组。
上这门课..。
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(string firstName, string lastName){
FirstName = firstName;
LastName = lastName;
}
}如果您将自定义解构函数添加到其定义中,如下所示...
public class Person {
...
public void Deconstruct(out string firstName, out string lastName){
firstName = FirstName;
lastName = LastName;
}
}现在,您可以在具有双字符串元组的情况下使用该类型的实例,如下所示...
var p = Person("John", "Smith");
var (firstName, lastName) = p;
log(firstName); // Prints 'John'基本上,接受双字符串元组的任何地方现在都可以直接接受Person对象,解构函数将发挥它的魔力来填充它的值。它甚至可以像上面那样推断类型。
那么,Swift是否支持自定义类型的解构函数?如果没有,有没有类似的东西?
发布于 2020-06-18 09:06:44
基于上面的评论,我会给出一个更具体的建议…我不认为解构概念有什么相似之处,但有几种方法可以让不同的对象以类似的方式表示自己,例如通过字符串元组。
我假设这里的部分目标是能够将不同类型的对象传递给一些希望将更通用的元组作为输入的方法。
一种类似Swift的方法是使用声明元组表示的协议,并让您想要处理的任何对象都符合该协议。它可能需要几乎一样多的单词来描述,就像at仅仅是代码一样。:)
下面是一个协议示例:
protocol TwoString {
var tupl: (String, String) { get }
}下面是一个简单的类,它采用了返回名字和姓氏的协议:
class Name: TwoString {
var first: String = ""
var last: String = ""
init(first: String, last: String) { self.first = first; self.last = last }
var tupl: (String, String) {
get {
return (self.first, self.last)
}
}
}另一个类可以采用该协议并对元组使用不同的字段对,例如
class Taxonomy: TwoString {
var genus: String = ""
var species: String = ""
init(genus: String, species: String) { self.genus = genus; self.species = species }
var tupl: (String, String) {
get {
return (self.genus, self.species)
}
}
}现在,您可以拥有采用TwoString协议类型的方法,而无需了解底层类的任何信息,只是它可以提供自身的双字符串元组表示。
如果您希望将最初未定义的对象转换为也支持该协议,则可以使用在现有类上声明和实现该协议的Swift扩展:
extension Data: TwoString {
var tupl: (String, String) {
get {
return (String(describing:self.count), self.base64EncodedString())
}
}
}现在,像func handleTwoString(_ item: TwoString)这样的方法可以接受一个名称、分类法或数据对象,并获得一个双字符串的元组,而不需要知道底层对象的任何其他信息。
或者,如果您希望使用接受两项元组的API,则始终可以显式传递tupl成员:
SomeAPI.handleStringTuple(myName.tupl)
SomeAPI.handleStringTuple(taxonomy.tupl)
SomeAPI.handleStringTuple(someData.tupl)https://stackoverflow.com/questions/62440403
复制相似问题