如何在Apple Swift中定义新的“String”类型?

时间:2015-08-02 17:06:47

标签: string swift types

我有一些引用字符串,我发布版本中的应用程序只是从一个服务接收并传递给另一个服务。出于调试目的,有必要比较两个引用并将它们打印到控制台。

我的应用程序至少有两种不同类型的参考字符串 - 两者都不会被分配给另一种。

我希望在我的代码中有两个唯一类型,称为ArticleReference和ResultReference。

我首先定义了一个“通用”协议,我可以从中构建ArticleReference和ResultReference。我们在这里处理ArticleReference。

public protocol ReferenceType: Comparable, StringLiteralConvertible {
    var value:String {set get}
    init(_ value:String)
}

public func + <T :ReferenceType> (lhs:T, rhs:T) -> T {
    return T(lhs.value + rhs.value)
}

public func += <T :ReferenceType> (inout lhs:T, rhs:T) -> T {
    lhs.value += rhs.value
}

public func == <T :ReferenceType> (lhs:T, rhs:T) -> Bool {
    return lhs.value == rhs.value
}

public func < <T :ReferenceType> (lhs:T, rhs:T) -> Bool {
    return lhs.value < rhs.value
}

public func > <T :ReferenceType> (lhs:T, rhs:T) -> Bool {
    return lhs.value > rhs.value
}

这是参考类型之一。

public struct ArticleReference :ReferenceType {
    public var value:String
    public init(_ value:String) {
        self.value = value
    }
}

Xcode 6.4抱怨ArticleReference。

public init(_ value:String) {

错误:初始化程序'init'与协议'StringLiteralConvertible'所需的参数不同('init(stringLiteral :);) 并提议用'stringLiteral

替换'_'

如果我接受对'stringLiteral'Xcode的更改,则建议'stringLiteral'替换为'_'!无限错误循环。

我采取了正确的方法吗?如果是这样我哪里出错?

2 个答案:

答案 0 :(得分:0)

错误消息可能会产生误导。问题是2继承自protocol ReferenceType,但是你 没有为您的StringLiteralConvertible实施所需的方法。

可能的实施可能是

struct ArticleReference

添加它会使您的代码编译没有错误。

答案 1 :(得分:0)

使用ReferenceType协议在每个结构中需要多个init函数。

public struct ArticleReference:ReferenceType {
    public var value:String
    public init(_ value:String) {
        self.value = value
    }

    public init(stringLiteral value:String) {
        self.value = value
    }

    public init(extendedGraphemeClusterLiteral value:String) {
        self.value = value
    }

    public init(unicodeScalarLiteral value:String) {
       self.value = value
    }
}