2016-06-21 17 views
187

Po konwersji kodu na najnowszy SWIFT 3.0 wyświetlany jest ten błąd.CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero są niedostępne w Swift

enter image description hereenter image description here

powiedzieć mi również rozwiązanie dla CGSize = CGSizeMake(0,0)

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

który jest również niedostępny.

+0

Ale po konwersji mojego poprzedniego kodu na swift3 mam ten problem, chciałbym się dowiedzieć, czy jest jakaś zmiana w składni zaktualizowanej wersji – niravdesai21

Odpowiedz

406

CGRect Można po prostu utworzyć za pomocą instancji z CGPoint lub CGSize, podanej poniżej.

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)) 

Lub jeśli chcemy określić każdą wartość w CGFloat lub Double lub Int, możemy użyć tej metody.

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

CGPoint Może być tworzone w taki sposób.

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

CGSize Można stworzyć w ten sposób.

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

Również rozmiar i punkt z 0 jako wartościami, można to zrobić w ten sposób.

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 zastąpione CGRect.zero & CGPoint.zero w Swift 3.0.

+0

Czy możesz mi również powiedzieć rozwiązanie dla CGSize = CGSizeMake (0 , 0) który nie jest woking w szybkim 3 – niravdesai21

+0

@ niravdesai21 Zaktualizowano pytanie, proszę sprawdzić. –

+0

CGPointZero i CGRectZero również nie są dostępne żadne rozwiązanie? Zaktualizowane pytanie proszę zaktualizować odpowiedź – niravdesai21

8

Struktury, jak również wszystkie inne symbole w Core Graphics i innych interfejsach API stały się czystsze, a także zawierają nazwy parametrów. 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 przykład:

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

CGVector przykład:

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

CGSize przykład:

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

CGRect przykład:

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

firmy Apple Blog

Swift składniowe i zmiana nazwy zmiany w API Swift 3 sprawiają, że czują się bardziej język naturalny i zapewnić jeszcze bardziej Swift-y doświadczenia podczas wywoływania ram kakao. Popularne struktury Core Graphics i Grand Central Dispatch mają nowe, znacznie czystsze interfejsy w Swift.

39

Szybka poprawka dla CGRectMake, CGPointMake, CGSizeMake w Swift3 & iOS10

Dodaj te rozszerzenia:

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) 
    } 
} 

Następnie przejdź do "Znajdowanie i zamienianie w Workspace" Znajdź CGRectMake, CGPointMake, CGSizeMake i zamień je na CGRect, CGP oint, CGSize

Czynności te może uratować cały czas jak Xcode teraz nie daje nam szybką konwersję z Swift 2+ do Swift 3

+0

Cholernie dobra robota wokół brata. + 1 –

+0

@AdrianP, dzięki mate –

+0

Wspaniałe rozwiązanie! – Oprimus

20

w Swift 3, można po prostu użyć CGPoint.zero lub CGRect.zero zamiast CGRectZero lub CGPointZero.

Jednak w Swift 4, tylko CGRect.zero zadziała

4

Spróbuj wykonać następujące czynności:

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

to dla Swifta najnowszej wersji

+0

podoba mi się (Y), to byłoby łatwiejsze do autouzupełniania – Husam

4

Swift 3 Bonus: Dlaczego didn nikt nie wspomniał o krótkiej formie?

CGRect(origin: .zero, size: size) 

.zero zamiast CGPoint.zero

Gdy typ jest określony, można bezpiecznie pominąć go.

2

Jeśli chcesz ich używać jako w Swift 2, można użyć tych funcs:

Dla CGRectMake:

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

Dla CGPointMake:

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

Dla CGSizeMake:

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

Po prostu umieść je poza klasą i powinno działać. (Działa przynajmniej dla mnie)