Swift中的字符串子类解决方法

Swift中的字符串子类解决方法,swift,string,email,struct,subclass,Swift,String,Email,Struct,Subclass,在我的应用程序中,我使用的各种结构基本上都应该是字符串子类,但字符串本身就是一个结构,所以不可能对它进行子类化。例如,我有一个电子邮件对象,其中有一个地址变量,然后计算变量,如isValid,或者函数,如compose()。关键是,当整个对象实际上应该是地址时,通过address属性访问实际的电子邮件地址似乎是荒谬的 那么,创建电子邮件对象的正确方法是什么?这是唯一的办法吗?或者有没有一种方法可以对字符串进行子类化,从而使我的电子邮件结构实际上是一个带有一些电子邮件特定功能的字符串?我会使用如下

在我的应用程序中,我使用的各种结构基本上都应该是字符串子类,但字符串本身就是一个结构,所以不可能对它进行子类化。例如,我有一个电子邮件对象,其中有一个
地址
变量,然后计算变量,如
isValid
,或者函数,如
compose()
。关键是,当整个对象实际上应该是地址时,通过
address
属性访问实际的电子邮件地址似乎是荒谬的


那么,创建
电子邮件
对象的正确方法是什么?这是唯一的办法吗?或者有没有一种方法可以对字符串进行子类化,从而使我的电子邮件结构实际上是一个带有一些电子邮件特定功能的字符串?

我会使用如下内容:

import Foundation

struct EmailAddress {
    let stringValue: String

    static func isValidEmailAddress(_ s: String) -> Bool {
        //implement me
        return true
    }

    init?(fromString s: String) {
        guard EmailAddress.isValidEmailAddress(s) else { return nil }
        self.stringValue = s
    }

    var localPart: String {
        return stringValue.components(separatedBy: "@").first!
    }

    var domain: String {
        return stringValue.components(separatedBy: "@").last!
    }

    // expose other functions that make sense to e-mail addresses.
    // importantly, this doesn't expose *all* String methods,
    // most of which wouldn't make sense in the context of a String
}

我会用这样的方式:

import Foundation

struct EmailAddress {
    let stringValue: String

    static func isValidEmailAddress(_ s: String) -> Bool {
        //implement me
        return true
    }

    init?(fromString s: String) {
        guard EmailAddress.isValidEmailAddress(s) else { return nil }
        self.stringValue = s
    }

    var localPart: String {
        return stringValue.components(separatedBy: "@").first!
    }

    var domain: String {
        return stringValue.components(separatedBy: "@").last!
    }

    // expose other functions that make sense to e-mail addresses.
    // importantly, this doesn't expose *all* String methods,
    // most of which wouldn't make sense in the context of a String
}

我相信
extension
也是您心中的想法,但是如果您觉得在
Email
对象中使用名称
String
不舒服。。。那么,我只提出以下建议:

protocol Email {
    func compose() -> Email
    var isValidEmail: Bool
}

extension String: Email {
    func compose() -> Email {
         return something...
    }
    ...
}

var a: Email = "abc"
a.compose()

当然,这并不能消除你对
String
连接到
电子邮件
功能的疑虑。

我相信
扩展
也是你心中的想法,但是如果你觉得在
电子邮件
对象中使用
String
这个名称不舒服。。。那么,我只提出以下建议:

protocol Email {
    func compose() -> Email
    var isValidEmail: Bool
}

extension String: Email {
    func compose() -> Email {
         return something...
    }
    ...
}

var a: Email = "abc"
a.compose()

当然,这并不能消除您对
String
连接到
电子邮件
功能的疑虑。

我想过这样做,但我有更多类似的对象。例如,我有一个address对象,表示一个物理地址(如在location中),它有自己的isValid变量,与电子邮件变量不同。这意味着我必须将其更改为例如.isValidEmail和.isValidAddress,为字符串添加许多方法,这似乎不正确。此外,自定义结构允许我将变量的类型限制为例如仅限电子邮件,这意味着我可以进行各种检查,以确保电子邮件始终是电子邮件,而字符串可以是任何字符串。仅创建一个封装
字符串
值的结构有什么问题?子类化
字符串
,如果可能的话,将导致许多无意义的后果
String
有一大堆方法,这些方法在电子邮件类型中不存在任何业务。(子字符串,上/下大小写,可从整数初始化)你包装字符串值是什么意思?@DenisBalko我写了一个答案来说明我的意思mean@DenisBalko例如,有一个名为
EmailAddress
的类型,它包含一个
isValid
方法,没有多大意义>false,那么您实际上只有一个复杂的
字符串,而不是一个真正的电子邮件地址。可失败的初始值设定项非常适合这一点,这样您就可以知道,如果遇到
电子邮件地址
实例,它已经保证是有效的。我曾想过这样做,但我有更多类似这样的对象。例如,我有一个addres表示物理地址的对象(如在位置中)它有自己的isValid变量,与电子邮件变量不同。这意味着我必须将其更改为例如.isValidEmail和.isValidAddress,为字符串添加许多方法,这似乎不正确。此外,自定义结构允许我将变量的类型限制为例如仅电子邮件,这意味着我可以这样做各种各样的检查,以确保电子邮件始终是电子邮件,而字符串可以是任何字符串。仅仅创建一个包装
字符串
值的结构有什么问题?如果可能,子类化
字符串
,将导致许多无意义的后果。
字符串
有一大堆没有业务的方法ess存在于电子邮件类型中。(子字符串,上/下大小写,可从整数初始化)你包装字符串值是什么意思?@DenisBalko我写了一个答案来说明我的意思mean@DenisBalko例如,有一个名为
EmailAddress
的类型,它包含一个
isValid
方法,没有多大意义>false
,那么您实际上只是一个复杂的
字符串,而不是一个真正的电子邮件地址。可失败的初始值设定项非常适用于此,这样您就可以知道,如果遇到
电子邮件地址
实例,它已经保证是有效的。但这与“例如,我有一个电子邮件对象,其中有一个地址变量,然后是计算变量,如isValid或函数,如compose()”等等?如果OP不喜欢这样,为什么他喜欢这样?但这与”例如,我有一个电子邮件对象,其中有一个地址变量,然后计算变量,如isValid或函数,如compose(),等等?如果OP不喜欢这样,为什么他喜欢这样?