CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero недоступны в Swift.

После преобразования кода в последнюю версию Swift 3.0 мне показывают эту ошибку.

введите здесь описание изображения  введите здесь описание изображения

Также подскажите решение для CGSize = CGSizeMake(0,0)

static var frameAtStartOfPan: CGRect = CGRectZero
static var startPointOfPan: CGPoint = CGPointZero

Что тоже недоступно.


person niravdesai21    schedule 21.06.2016    source источник
comment
Но после преобразования моего предыдущего кода в swift3 я столкнулся с этой проблемой, хотел бы знать, есть ли какие-либо изменения в синтаксисе в обновленной версии.   -  person niravdesai21    schedule 21.06.2016


Ответы (10)


CGRect Можно просто создать, используя экземпляр CGPoint или CGSize, как указано ниже.

let rect = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 100, height: 100))  

// Or

let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 100))

Или, если мы хотим указать каждое значение в CGFloat или Double или Int, мы можем использовать этот метод.

let rect = CGRect(x: 0, y: 0, width: 100, height: 100) // CGFloat, Double, Int

CGPoint Можно создать так.

 let point = CGPoint(x: 0,y :0) // CGFloat, Double, Int

CGSize Можно создать так.

let size = CGSize(width: 100, height: 100) // CGFloat, Double, Int

Также размер и точка с 0 в качестве значений, это можно сделать так.

let size = CGSize.zero // width = 0, height = 0
let point = CGPoint.zero // x = 0, y = 0, equal to CGPointZero
let rect = CGRect.zero // equal to CGRectZero

CGRectZero и CGPointZero заменены на CGRect.zero и CGPoint.zero в Swift 3.0.

person Community    schedule 21.06.2016
comment
Можете ли вы также сказать мне решение для CGSize = CGSizeMake (0,0), которое не работает в Swift 3 - person niravdesai21; 22.06.2016
comment
@ niravdesai21 Обновил вопрос, пожалуйста, проверьте. - person ; 22.06.2016
comment
CGPointZero и CGRectZero также не доступны для решения этой проблемы? Обновленный вопрос, пожалуйста, обновите ответ - person niravdesai21; 22.06.2016
comment
@niravdesai21 Обновлено. - person ; 22.06.2016
comment
@ niravdesai21 Мне все еще интересно, почему вы не приняли ни одного ответа? Вам нужно больше разъяснений по этому простому вопросу? - person ; 23.06.2016
comment
CGRectZero недоступен в Swift, хотя на самом деле это изменение синтаксиса CGRect.zero — это шутка! Этим парням нужно поработать над своими предупреждениями о компиляции... Они постоянно полагаются на переполнение стека, чтобы выручить их. - person Magoo; 04.10.2016
comment
В первом примере вы можете использовать такое сокращение: let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 100)) - person Code Different; 23.02.2017

Быстрое исправление для CGRectMake , CGPointMake, CGSizeMake в Swift3 и iOS10

Добавьте эти расширения:

extension CGRect{
    init(_ x:CGFloat,_ y:CGFloat,_ width:CGFloat,_ height:CGFloat) {
        self.init(x:x,y:y,width:width,height:height)
    }

}
extension CGSize{
    init(_ width:CGFloat,_ height:CGFloat) {
        self.init(width:width,height:height)
    }
}
extension CGPoint{
    init(_ x:CGFloat,_ y:CGFloat) {
        self.init(x:x,y:y)
    }
}

Затем перейдите к «Найти и заменить в рабочей области». Найдите CGRectMake , CGPointMake, CGSizeMake и замените их на CGRect , CGPoint, CGSize.

Эти шаги могут сэкономить все время, поскольку Xcode прямо сейчас не дает нам быстрого преобразования с Swift 2+ на Swift 3.

person Rafat touqir Rafsun    schedule 29.09.2016
comment
Гениальное решение! - person Oprimus; 02.08.2017
comment
@Oprimus надеюсь, это уменьшит ваши хлопоты :) - person Rafat touqir Rafsun; 02.08.2017

В Swift 3 вы можете просто использовать CGPoint.zero или CGRect.zero вместо CGRectZero или CGPointZero.

Однако в Swift 4 CGRect.zero и 'CGPoint.zero' будут работать.

person guru    schedule 12.10.2016

Если вы хотите использовать их как в Swift 2, вы можете использовать эти функции:

Для CGRectMake:

func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

Для CGPointMake:

func CGPointMake(_ x: CGFloat, _ y: CGFloat) -> CGPoint {
    return CGPoint(x: x, y: y)
}

Для CGSizeMake:

func CGSizeMake(_ width: CGFloat, _ height: CGFloat) -> CGSize {
    return CGSize(width: width, height: height)
}

Просто поместите их вне любого класса, и это должно работать. (По крайней мере у меня работает)

person CaOs433    schedule 17.08.2017

Структуры, а также все другие символы в Core Graphics и других API стали более понятными и также включают имена параметров. https://developer.apple.com/reference/coregraphics#symbols

CGRect(x: Int, y: Int, width: Int, height: Int)
CGVector(dx: Int, dy: Int)
CGPoint(x: Double, y: Double)
CGSize(width: Int, height: Int)

Пример CGPoint:

let newPoint = stackMid.convert(CGPoint(x: -10, y: 10), to: self)

Пример CGVector:

self.physicsWorld.gravity = CGVector(dx: 0, dy: gravity)

Пример CGSize:

hero.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 18))

Пример CGRect:

let back = SKShapeNode(rect: CGRect(x: 0-120, y: 1024-200-30, width: 240, height: 140), cornerRadius: 20)

Блог Apple

Изменения в синтаксисе Swift и переименовании API в Swift 3 делают язык более естественным и обеспечивают еще более похожий на Swift опыт при вызове фреймворков Cocoa. Популярные фреймворки Core Graphics и Grand Central Dispatch имеют новый, гораздо более понятный интерфейс в Swift.

person Edison    schedule 21.06.2016

Попробуйте следующее:

var myToolBar = UIToolbar.init(frame: CGRect.init(x: 0, y: 0, width: 320, height: 44))

Это для последней версии swift

person BurakLGN    schedule 31.10.2016
comment
нравится (Y), это было бы проще для автоматического завершения - person Husam; 08.12.2016

Бонус Swift 3: почему никто не упомянул краткую форму?

CGRect(origin: .zero, size: size)

.zero вместо CGPoint.zero

Когда тип определен, его можно смело опустить.

person Dmitry Isaev    schedule 16.02.2017

Вы можете использовать это с заменой CGRectZero

CGRect.zero
person jaskiratjd    schedule 15.10.2018

В Swift 4 это работает, как показано ниже.

collectionView.setContentOffset(CGPoint.zero, animated: true)
person Neha    schedule 18.06.2018

Для CGSize

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
person Team chang    schedule 14.04.2019