Swift:String.join()如何工作自定义类型?

Ken*_*ang 16 swift

例如:

var a = [1, 2, 3]    // Ints
var s = ",".join(a)  // EXC_BAD_ACCESS
Run Code Online (Sandbox Code Playgroud)

是否可以使连接函数返回"1,2,3"?

扩展Int(或其他自定义类型)以符合某些协议?

Jon*_*auz 33

Xcode的7.0测试版6斯威夫特2,现在你应该使用[String].joinWithSeparator(",").
在您的情况下,您仍然需要将Int更改为String类型,因此我添加了map().

var a = [1, 2, 3]                                       // [1, 2, 3]
var s2 = a.map { String($0) }.joinWithSeparator(",")    // "1,2,3"
Run Code Online (Sandbox Code Playgroud)

Xcode的8.0的β1夫特3代码稍有变化到 [String].joined(separator: ",").

var s3 = a.map { String($0) }.joined(separator: ",")    // "1,2,3"
Run Code Online (Sandbox Code Playgroud)


Bry*_*hen 29

试试这个

var a = [1, 2, 3]    // Ints
var s = ",".join(a.map { $0.description })
Run Code Online (Sandbox Code Playgroud)

或者添加此扩展程序

extension String {
    func join<S : SequenceType where S.Generator.Element : Printable>(elements: S) -> String {
        return self.join(map(elements){ $0.description })
    }

  // use this if you don't want it constrain to Printable
  //func join<S : SequenceType>(elements: S) -> String {
  //    return self.join(map(elements){ "\($0)" })
  //}
}

var a = [1, 2, 3]    // Ints
var s = ",".join(a)  // works with new overload of join
Run Code Online (Sandbox Code Playgroud)

join定义为

extension String {
    func join<S : SequenceType where String == String>(elements: S) -> String
}
Run Code Online (Sandbox Code Playgroud)

这意味着它需要一个字符串序列,你不能将一系列int传递给它.


小智 10

而只是为了让您的生活更完整的,从开始的Xcode 8.0 Beta 1中斯威夫特3,你现在应该使用[String].joined(separator: ",").

这是Swift API的新"ed/ing"命名规则:

根据副作用命名功能和方法

  • 那些没有副作用的人应该读作名词短语,例如xdistance(to:y),i.successor().
  • 那些有副作用的人应该读作命令式动词短语,例如print(x),x.sort(),x.append(y).
  • 名称突变/非突变方法对一致.变异方法通常具有类似语义的非突变变体,但返回新值而不是就地更新实例. Swift:API设计指南


Ant*_*nio 6

最简单的方法是改变@ BryanChen的答案:

",".join(a.map { String($0) } )
Run Code Online (Sandbox Code Playgroud)

  • `description`字段用于提供人类可读的描述.对于`Int`通常是将数字转换为其字符串表示.但是它是一个(计算的)属性,它可以被覆盖,虽然这对于`Int`不太可能发生. (3认同)
  • 这比使用`description`更好,结果不能得到保证.`String()`保证产生`String`. (2认同)