Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Swift是否支持将自定义类型解构为元组?_C#_Swift_Tuples_Deconstructor - Fatal编程技术网

C# Swift是否支持将自定义类型解构为元组?

C# Swift是否支持将自定义类型解构为元组?,c#,swift,tuples,deconstructor,C#,Swift,Tuples,Deconstructor,在这里,您可以使用解构来装饰自定义类型,以允许它们自动解构为元组 上这门课 public class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person(string firstName, string lastName){ FirstName = firstName; LastName =

在这里,您可以使用解构来装饰自定义类型,以允许它们自动解构为元组

上这门课

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'
您现在可以使用这种类型的实例,其中有两个字符串元组,如下所示

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是否支持自定义类型的解构器呢?如果没有,有什么相似的吗?

我会根据以上评论给出更具体的建议。。。我不相信解构主义的概念有确切的相似之处,但有几种方法可以让不同的对象以类似的方式表示自己,例如通过一组字符串

我假设这里的部分目标是能够将不同类型的对象传递给希望更通用的元组作为输入的某些方法

一种类似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,则始终可以显式地传递元组成员:

SomeAPI.handleStringTuple(myName.tupl)
SomeAPI.handleStringTuple(taxonomy.tupl)
SomeAPI.handleStringTuple(someData.tupl)

我不知道有任何自动转换,尽管生成一个返回类的某些或所有字段的元组的计算变量很简单。可以用计算的元组变量定义一个简单的协议,并定义方法来获取该协议的实例——这样不同类型的对象就可以向通用方法提供元组数据。但是请注意,元组(如结构)不是对象,也不可散列,因此有许多方法不能使用它,而对象可以使用它。这与我所说的方向相反。那是建筑,我说的是解构。。。通过一组明确的规则从一个对象或结构到一个元组。你应该把它作为一个答案,而不是一个注释发布。这不仅(多得多!)更具可读性,而且我也不能“接受”一条评论,如果它有效的话。我还不知道,因为我看不懂!;)有趣的方法,但这需要消费API了解
TwoString
。正如上面@LeoDabus所建议的,它可能只是将元组作为属性公开(可能通过扩展)并使用它。不是像C#那么干净,而是一些东西。是的,你可以向任何东西添加一个元组计算变量,但协议的目的是实现将对象按原样传递到接口(而不是对象的属性)的目标——用你最初的问题的话来说,“你现在可以在有两个字符串元组的情况下使用该类型的实例”。简单地添加一个属性并不能实现这一点,尽管它确实节省了一点代码。完全同意,但协议方法相对于变量方法的问题是,我可以将变量传递给已经存在的采用元组的API,而我不能使用协议。它完美吗?没有,但它是可用的。但是,除非我自己编写API来接受协议,否则无法使用该协议,在这种情况下,是的,协议将是绝对可行的。但这是一个协议,不是元组。元组是这里的重要部分。可惜斯威夫特不支持解构。明白了-我修改了我的答案,以表明它也适用于采用字符串元组的API。基本上,这个答案是最小答案的超集-它包括计算的var,但如果需要,还添加了一些额外的类型安全性。还可能值得注意的是,如果不是一个巨大的API,那么从协议到普通元组的adatper扩展将很容易添加。但我想基于C++来声明类似的东西,声明一个类型运算符自动将一个对象类型转换为另一个对象,这在Swift AFAIK中不太常见。