The task is as follows:

Write a function that takes the natural number N.
A one-dimensional array of size N filled with random numbers. To display the number of prime numbers in the array (For convenience of checking, additionally output the generated array). To generate a prime number, you can use the arc4random () global function. It should be noted that the function returns a value of type UInt32 (a conversion is required), and also works on the whole range (arc4random ()% 100 can be used to get numbers in the interval [0, 100))

My implementation is below on Swift 3 in the Playground:

import Foundation func createRandomArray(withLength n: Int) -> Any { if n == 0 || n < 0 { return 0 } var generatedArray: [Int?] = [] var primeNumbers: [Int?] = [] for _ in 1...n { generatedArray.append(Int(arc4random() % 100)) } thisWay: for number in generatedArray { // Избегаю деления элемента массива на самого себя, // так как понятно, что при делении числа на самого себя // остаток будет 0. let preNumber = generatedArray[number!]! - 1 for divider in preNumber..<1 { if generatedArray[number!]! % divider == 0 { continue thisWay } else { primeNumbers.append(generatedArray[number!]!) } } } // Выводим тапл. return (generatedArray, primeNumbers) } createRandomArray(withNumberOfElements: 13) 

Displays an unexpected error:

There are no syntax errors, according to IDE. I don’t know how to work with a debugger at the moment - I just started to master Swift development in Xcode.

Question : what is wrong with my code? Or at least a hint would be grateful.

  • one
    it falls because you are trying to return two values. Still remove the '?' in the array declaration. they are superfluous there and will help get rid of all the "!". in an hour, non-lingous ones will come, rewrite your search for prime numbers. - Max Mikheyenko

1 answer 1

For starters, check

 if n == 0 || n < 0 { return 0 } 

2 conditions can be replaced by one:

 if n < 1 { 

Further,

 var generatedArray: [Int?] = [] var primeNumbers: [Int?] = [] 

replace with

 var generatedArray = [Int]() var primeNumbers = [Int]() 

Return function, as I understand it, should you have 2 arrays, so be it:

 func createRandomArrays(withLength n: Int) -> (generatedArray: [Int], primesArray: [Int])? 

Since you loop through the elements rather than the indices, you don’t

 generatedArray[number!]! 

but just a number .

Well, as far as I remember the search for prime numbers, the result will ultimately be:

 func createRandomArrays(withLength n: Int) -> (generatedArray: [Int], primesArray: [Int])? { if n < 1 { return nil } var generatedArray = [Int]() var primesArray = [Int]() for _ in 1...n { generatedArray.append(Int(arc4random() % 100)) } thisWay: for number in generatedArray { if number < 4 { primesArray.append(number) continue } let maxCondition = Int(sqrt(Double(number))) for divider in 2...maxCondition { if number % divider == 0 { continue thisWay } } primesArray.append(number) } return (generatedArray, primesArray) } var generateLength = 13 if let generatedArrays = createRandomArrays(withLength: generateLength) { print("Generated array: \(generatedArrays.generatedArray)") print("Primes array: \(generatedArrays.primesArray)") print("Primes count: \(generatedArrays.primesArray.count)") } else { print("generateLength < 1") }