2017-08-31 33 views
0

在我的应用程序中,我使用各种结构,应该基本上只是String子类,但String本身就是一个结构,因此无法对它进行子类化。例如,我有一个带有单个address变量的电子邮件对象,然后计算变量,如isValid或函数,如compose()。问题是,当整个对象实际上应该是地址时,通过address属性访问实际的电子邮件地址似乎很荒谬。Swift中的字符串子类解决方法

那么创建Email对象的正确方法是什么?这是唯一的方法吗?或者有没有解决字符串的一种方法,以便我的电子邮件结构实际上是一个字符串,只是一些电子邮件特定的功能?

+0

我想过这样做,但我有更多这样的对象。例如,我有一个地址对象表示一个物理地址(如位置),它有自己的isValid变量,它与电子邮件地址不同。这意味着我将不得不将它改成例如.isValidEmail和.isValidAddress,为String添加了很多方法,这看起来不正确。此外,自定义结构允许我将变量的类型限制为仅用于电子邮件,这意味着我可以进行各种检查以确保电子邮件始终是电子邮件,而字符串可以是任何字符串。 –

+0

刚刚创建一个包含'String'值的结构时会出现什么问题?如果可能,子类化'String'会导致许多无意义的后果。 '字符串'有一大堆方法,电子邮件类型中没有业务存在。 (sub-stringing,上/下壳,可从整数初始化 – Alexander

+0

你是什么意思通过包装字符串值? –

回答

3

我会用这样的:

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 
} 
+0

但这与“例如,我有一个电子邮件对象具有单个地址变量,然后计算变量(如isValid或诸如compose())等函数”有什么不同?如果OP不喜欢这个,他为什么喜欢这个? – matt

0

我相信extension的东西,你也有一点,但如果你使用的名称StringEmail对象......感觉不舒服,然后我就简单建议如下:

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

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

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

当然,这反而会不清楚String有连接Email功能你的疑惑。

相关问题