MIN() и MAX() в Swift и преобразование Int в CGFloat

#ios #objective-c #swift

#iOS #objective-c #swift

Вопрос:

Я получаю некоторые ошибки при использовании следующих методов:

1) Как мне return screenHeight / cellCount CGFLoat использовать первый метод?

2) Как мне использовать эквивалент MIN() и MAX() ObjC во втором методе?

 func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    var cellCount = Int(self.tableView.numberOfRowsInSection(indexPath.section))

    return screenHeight / cellCount as CGFloat
}

// #pragma mark - UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
    let height = CGFloat(scrollView.bounds.size.height)
    let position = CGFloat(MAX(scrollView.contentOffset.y, 0.0))

    let percent = CGFloat(MIN(position / height, 1.0))
    blurredImageView.alpha = percent
}
  

Комментарии:

1. Хотя это прокомментировано ниже, вы можете просто написать min или max в нижнем регистре. Это все для Swift.

Ответ №1:

1: Вы не можете перейти от Int к CGFloat. Вы должны инициализировать CGFloat с помощью Int в качестве входных данных.

 return CGFloat(screenHeight) / CGFloat(cellCount)
  

2. Используйте функции min и max, определенные стандартной библиотекой. Они определяются следующим образом:

 func min<T : Comparable>(x: T, y: T, rest: T...) -> T
func max<T : Comparable>(x: T, y: T, rest: T...) -> T
  

Использование заключается в следующем.

 let lower = min(17, 42) // 17
let upper = max(17, 42) // 42
  

Комментарии:

1.Спасибо, я принял ваш ответ, поскольку он прост, а также за предоставление полных min() max() функций. Я почти все сделал правильно, если бы только что преобразовал MIN() MAX() в нижний регистр.

Ответ №2:

Если вы используете Swift 3 max() и min() Теперь вызываете последовательность (т. Е. Коллекцию) вместо передачи аргументов:


let heights = [5, 6]
let max = heights.max() // -> 6
let min = heights.min() // -> 5

Ответ №3:

Вы можете просто использовать min() и max() — они встроенные.

Если бы вы хотели создать свой собственный (почему? — возможно, чтобы расширить его), вы бы использовали что-то вроде

 func myMin <T : Comparable> (a: T, b: T) -> T {
    if a > b {
        return b
    }
    return a
}
  

Ответ №4:

Вам необходимо явно преобразовать cellCount в CGFloat , поскольку Swift не выполняет автоматическое преобразование типов между целыми числами и числами с плавающей запятой:

 return screenHeight / CGFloat(cellCount)
  

min и max функции определяются стандартной библиотекой.