首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift是否支持将自定义类型解构为元组?

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

Stack Overflow用户
提问于 2020-06-18 08:23:35
回答 1查看 159关注 0票数 0

C# has a neat feature,您可以使用解构来修饰您的自定义类型,以允许它们自动解构为元组。

上这门课..。

代码语言:javascript
复制
public class Person {

    public string FirstName { get; set; }
    public string LastName  { get; set; }

    public Person(string firstName, string lastName){
        FirstName = firstName;
        LastName  = lastName;
    }
}

如果您将自定义解构函数添加到其定义中,如下所示...

代码语言:javascript
复制
public class Person {

    ...

    public void Deconstruct(out string firstName, out string lastName){
        firstName = FirstName;
        lastName  = LastName;
    }
}

现在,您可以在具有双字符串元组的情况下使用该类型的实例,如下所示...

代码语言:javascript
复制
var p = Person("John", "Smith");

var (firstName, lastName) = p;

log(firstName); // Prints 'John'

基本上,接受双字符串元组的任何地方现在都可以直接接受Person对象,解构函数将发挥它的魔力来填充它的值。它甚至可以像上面那样推断类型。

那么,Swift是否支持自定义类型的解构函数?如果没有,有没有类似的东西?

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 09:06:44

基于上面的评论,我会给出一个更具体的建议…我不认为解构概念有什么相似之处,但有几种方法可以让不同的对象以类似的方式表示自己,例如通过字符串元组。

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

一种类似Swift的方法是使用声明元组表示的协议,并让您想要处理的任何对象都符合该协议。它可能需要几乎一样多的单词来描述,就像at仅仅是代码一样。:)

下面是一个协议示例:

代码语言:javascript
复制
protocol TwoString {
    var tupl: (String, String) { get }
}

下面是一个简单的类,它采用了返回名字和姓氏的协议:

代码语言:javascript
复制
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)
        }
    }
}

另一个类可以采用该协议并对元组使用不同的字段对,例如

代码语言:javascript
复制
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扩展:

代码语言:javascript
复制
extension Data: TwoString {
    var tupl: (String, String) {
        get {
            return (String(describing:self.count), self.base64EncodedString()) 
        }
    }
}

现在,像func handleTwoString(_ item: TwoString)这样的方法可以接受一个名称、分类法或数据对象,并获得一个双字符串的元组,而不需要知道底层对象的任何其他信息。

或者,如果您希望使用接受两项元组的API,则始终可以显式传递tupl成员:

代码语言:javascript
复制
SomeAPI.handleStringTuple(myName.tupl)
SomeAPI.handleStringTuple(taxonomy.tupl)
SomeAPI.handleStringTuple(someData.tupl)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62440403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档