1

I have a list of items in an array. The default output of the items is a simple list separated by commas. However, a proper sentence would include the word "and" between the second last and last item in the list.


Swift code:

    let myItem1: String = "Apple"
    let myItem2: String = "Bee"
    let myItem3: String = "Carrot"
    let myItem4: String = "Dog"

    let myArray = Set(arrayLiteral: myItem1, myItem2, myItem3, myItem4)

    //print("Item count:", myArray.count)
    print("Item list:", myArray.joinWithSeparator(", "))

Output:

The current output above is: "Apple, Dog, Carrot, Bee"

However, the proper output should be: "Apple, Dog, Carrot and Bee"


Question:

How can I modify the code so that the output includes the word "and" between the second last and last item in the list?

4
  • 2
    Remove the last item, join with , as you do now. Add and & last item. Commented Sep 23, 2016 at 11:57
  • Related: Join an array of strings with a different final delimiter Commented Sep 23, 2016 at 12:58
  • 1
    Unrelated: Why is your set of strings named myArray? Also you should never have to use the init(xyzLiteral:) initialisers directly, they're meant for the compiler to use. In this case you can just do let mySet : Set = [myItem1, myItem2, myItem3, myItem4] Commented Sep 23, 2016 at 13:02
  • Thanks for the advice @Hamish. I guess myArray is better explained as mySet. arrayLiteral was used because Xcode suggested it and was retuning an error prior to that. Commented Sep 23, 2016 at 13:44

6 Answers 6

5

Pop the last element and then add it onto the string later:

let last = myArray.popLast()

let str =  myArray.joinWithSeparator(", ") + " and " + last!

Editing:

    let myItem1: String = "Apple"
    let myItem2: String = "Bee"
    let myItem3: String = "Carrot"
    let myItem4: String = "Dog"

    let mySetArray = Set(arrayLiteral: myItem1, myItem2, myItem3, myItem4)

    var myArray = Array(mySetArray)

    let last = myArray.popLast()

    let str =  myArray.joinWithSeparator(", ") + " and " + last!
    print(str)
Sign up to request clarification or add additional context in comments.

8 Comments

Wow, same thought!
We might be both wrong though, because this way we get ,s around the and.
we're well caught.
Provided a fix! :)
Excellant solution!
|
3

You can now just do

ListFormatter.localizedString(byJoining: names)

This gives

Apple, Bee, Carrot and Dog

Comments

2

Try this code

    let myItem1: String = "Apple"
    let myItem2: String = "Bee"
    let myItem3: String = "Carrot"
    let myItem4: String = "Dog"

    let myArray = Set(arrayLiteral: myItem1, myItem2, myItem3, myItem4)

    //print("Item count:", myArray.count)
    print("Item list:", myArray.joinWithSeparator(", "))

    var joinedString : NSString =  myArray.joinWithSeparator(", ")

    let lastRangeOfComma = joinedString.rangeOfString(",", options: .BackwardsSearch)
    joinedString = joinedString.stringByReplacingCharactersInRange(lastRangeOfComma, withString: " and")
    print("\(joinedString)")

Hope this helps.

Comments

2

Given an array of String(s)

let words = ["Apple", "Bee", "Carrot", "Dog"]

you can simply write

let sentence = words.dropLast().joinWithSeparator(", ") + " and " + words.last!

// Apple, Bee, Carrot and Dog

This code needs the words array to contain at least 2 elements to work properly.

1 Comment

Quite sophisticated aprrocuh!
1
var arrNames:[String] = ["Apple","Bee","Carrot","Dog"];
var allNames:String!


override func viewDidLoad() {
    super.viewDidLoad()

    allNames = arrNames[0]

    for i in 1...arrNames.count-1{
        if i == arrNames.count - 1 {
            allNames = allNames + " and " + arrNames[i]
        }else{
            allNames = allNames + ", " + arrNames[i]
        }
    }

    print(allNames)
}

Comments

1

One of the possible ways is to use functional programming:

let myArray = ["Apple", "Bee", "Carrot", "Dog"]


let mapedArray = myArray.dropLast().map{
    myArray.indexOf($0) == myArray.count - 2 ? $0 + " and " + myArray[myArray.count - 1] : $0 + ","
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.