I’ve made two attempts at this problem, I’m wondering how I can improve each of them and which approach is better.
1st attempt
///Orders parsed numbers by correctProvider -> unknownProvider -> incorrectProvider. If the users location can be idenitified we then order these subsets so the numbers for the users location are on top. private static func sortParsedNumbers(meeting: Meeting) -> [String] { let unknownProviderNumbers = meeting.phoneNumbers.filter { ConferenceNumberDirectory.findProvider(forNumber: $ 0) == .unknown } var correctProviderNumbers = meeting.phoneNumbers.filter { ConferenceNumberDirectory.findProvider(forNumber: $ 0) == meeting.conferenceProvider } let incorrectProviderNumbers = meeting.phoneNumbers.filter { !unknownProviderNumbers.contains($ 0) && !correctProviderNumbers.contains($ 0) } if let userCountry = getUserLocation() { let userAndNumberLocationMatch = {ConferenceNumberDirectory.findCountryISOCodes(forNumber: $ 0).contains(userCountry)} let matchingLocationNumbers = correctProviderNumbers.filter(userAndNumberLocationMatch) let nonMatchingLocationNumbers = correctProviderNumbers.filter {matchingLocationNumbers.contains($ 0)} correctProviderNumbers = matchingLocationNumbers + nonMatchingLocationNumbers } return correctProviderNumbers + unknownProviderNumbers + incorrectProviderNumbers
2nd attempt
///Orders parsed numbers by correctProvider -> unknownProvider -> incorrectProvider. If the users location can be idenitified we then order these subsets so the numbers for the users location are on top. private static func sortParsedNumbers(meeting: Meeting) -> [String] { guard let userCountry = getUserLocation() else { let numbersOrderedByProvider = meeting.phoneNumbers.sorted {element,_ in ConferenceNumberDirectory.findProvider(forNumber: element) == .unknown } .sorted {element,_ in ConferenceNumberDirectory.findProvider(forNumber: element) == meeting.conferenceProvider} return numbersOrderedByProvider } let numbersOrderedByLocation = meeting.phoneNumbers.sorted(by: {x,_ -> Bool in ConferenceNumberDirectory.findCountryISOCodes(forNumber: x).contains(userCountry)} ) let numbersOrderedByLocationAndProvider = numbersOrderedByLocation.sorted {ConferenceNumberDirectory.findProvider(forNumber: $ 0) == .unknown && ConferenceNumberDirectory.findProvider(forNumber: $ 1) != .unknown } .sorted {ConferenceNumberDirectory.findProvider(forNumber: $ 0) == meeting.conferenceProvider && ConferenceNumberDirectory.findProvider(forNumber: $ 1) != meeting.conferenceProvider} return numbersOrderedByLocationAndProvider }