Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

swift fast enumeration of optionals

Is there are better way to do this? Something that looks nicer syntax wise?

let a : [Any] = [5,"a",6]
for item in a { 
  if let assumedItem = item as? Int {
     print(assumedItem) 
  } 
}

Something like this, but then with the correct syntax?

  for let item in a as? Int { print(item) }
like image 249
user965972 Avatar asked Sep 14 '15 10:09

user965972


3 Answers

With Swift 5, you can choose one of the following Playground sample codes in order to solve your problem.


#1. Using as type-casting pattern

let array: [Any] = [5, "a", 6]

for case let item as Int in array {
    print(item) // item is of type Int here
}

/*
 prints:
 5
 6
 */

#2. Using compactMap(_:) method

let array: [Any] = [5, "a", 6]

for item in array.compactMap({ $0 as? Int }) {
    print(item) // item is of type Int here
}

/*
 prints:
 5
 6
 */

#3. Using a where clause and is type-casting pattern

let array: [Any] = [5, "a", 6]

for item in array where item is Int {
    print(item) // item conforms to Any protocol here
}

/*
 prints:
 5
 6
 */

#4. Using filter(_:​) method

let array: [Any] = [5, "a", 6]

for item in array.filter({ $0 is Int }) {
    print(item) // item conforms to Any protocol here
}

/*
 prints:
 5
 6
 */
like image 185
Imanou Petit Avatar answered Oct 17 '22 23:10

Imanou Petit


If you're using Swift 2:

let array: [Any] = [5,"a",6]

for case let item as Int in array {
    print(item)
}
like image 40
ABakerSmith Avatar answered Oct 17 '22 22:10

ABakerSmith


Two solutions

let a = [5,"a",6]

a.filter {$0 is Int}.map {print($0)}

or

for item in a where item is Int {
    print(item)
}

actually there are no optionals at all in the array

like image 33
vadian Avatar answered Oct 17 '22 23:10

vadian