2016-08-05 47 views
3
var mentions = ["@alex", "@jason", "@jessica", "@john"] 

我想我的数组限制在3个项目,所以我想它拼接:如何在Swift中执行数组切片?

var slice = [String]() 
if mentions.count > 3 { 
    slice = mentions[0...3] //alex, jason, jessica 
} else { 
    slice = mentions 
} 

但是,我越来越:

暧昧与标基本类型“[字符串]”和指数型 '范围'

苹果夫特版本2.2(swiftlang-703.0.18.8铛-703.0.31) 目标:x86_64的-苹果macosx10.9

+1

可以只是做'让切片= mentions.prefix(3)' – dan

+0

感谢。但是作为参考,如果我不想从0开始加前缀,你能告诉我怎么做吗? – TIMEX

回答

11

问题是,mentions[0...3]返回ArraySlice<String>,而不是Array<String>。因此你可以首先使用Array(_:)初始化剂,以便将片转换成一个数组:

let first3Elements : [String] // An Array of up to the first 3 elements. 
if mentions.count >= 3 { 
    first3Elements = Array(mentions[0 ..< 3]) 
} else { 
    first3Elements = mentions 
} 

或者,如果你想使用ArraySlice(它们可用于中间计算是有用的,因为它们呈现出“视图”到原数组,但不适合长期储存),你可以下标mentions与您else全方位指数:

let slice : ArraySlice<String> // An ArraySlice of up to the first 3 elements 
if mentions.count >= 3 { 
    slice = mentions[0 ..< 3] 
} else { 
    slice = mentions[mentions.indices] // in Swift 4: slice = mentions[...] 
} 

虽然目前为止最简单的解决办法是只使用prefix(_:)方法,该方法将返回一个前n个元素,或者如果n超过整个阵列的切片的阵列计数:

let slice = mentions.prefix(3) // ArraySlice of up to the first 3 elements 
+0

您提供的第一个解决方案不起作用。它仍然返回所有4个名字。 – TIMEX

+1

@TIMEX这就是你原来的代码所做的事情,因为你从0到3的索引,因此4个项目 - 如果你想要第一个3(和...),你可以使用范围'0 .. <3'当然改变计数检查)。我已经更新了我的答案。 – Hamish