2017-01-16 39 views
0

我想创建一个扩展String它接受一个类型T作为输入,并通过一String作为输入创建该类型T以字符串分隔成部件的Array泛型ExpressibleByStringLiteral字符串转换

extension String { 
    func convertToArrayOfTypesWithSeperator<T: ExpressibleByStringLiteral>(type : T.Type, seperator: String) -> [T] { 
     var res : [T] = [] 
     self.components(separatedBy: seperator).forEach { s in 
      // Cast to Type 
      // Add to res 
     } 
     return res 
    } 
} 

现在我知道了T必须符合ExpressibleByStringLiteral其作为docs国家应该有一个初始化:

init(stringLiteral value: Self.StringLiteralType) 

所以我尝试我的字符串组成s投用我作为输入传递类型:

let t = type.init(stringLiteral: s) 

但我不断收到关于有使用这些参数没有初始化它的错误。这里出了什么问题?

+0

这是否真的值得的延伸? 's.components(separatedBy:“,”).map(SomeClass.init)' – Alexander

+1

您应该使用功能映射算法,它使得事情更简单:'yourString.components(separatedBy:separator).map {YourType($ 0)} ' – Palle

+0

但是如果你有比我目前写的更具体的要求。在这种情况下,不是关于结果,而是使用泛型实现它的方法。 – Emptyless

回答

0

我没有使用它自己,但从它的外观我看不到有什么保证Self.StringLiteralType必须等于String,因此,您不能只将String的实例传递给构造函数。

解决方案:投sT.StringLiteralType

+0

在移动设备上输入时有点糊涂。但希望现在修好。 – Andreas

+0

是的,谢谢!它现在有效。不符合我的最终目标(使用Int和Float作为函数参数T,因为它们具有init(text:String),但是可以处理字符串文字。 – Emptyless

+0

为什么不直接定义自己的协议并扩展所有类型你想要使用吗?不需要依赖'ExpressibleByStringLiteral'。 – Andreas