스위프트에서는 CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero를 사용할 수 없습니다


242

코드를 최신 swift 3.0으로 변환 한 후이 오류가 표시됩니다.

여기에 이미지 설명을 입력하십시오여기에 이미지 설명을 입력하십시오

또한 해결책을 알려주세요 CGSize = CGSizeMake(0,0)

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

어느 것도 사용할 수 없습니다.


그러나 이전 코드를 swift3으로 변환 한 후이 문제가 발생했습니다. 업데이트 된 버전에서 구문에 어떤 변화가 있는지 알고 싶습니다
niravdesai21

답변:


493

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& CGPointZeroCGRect.zero& CGPoint.zeroin으로 대체 되었습니다 Swift 3.0.


신속한 3에서 깨어나지 않는 CGSize = CGSizeMake (0,0)에 대한 해결책을 알려 주시겠습니까?
niravdesai21

@ niravdesai21 질문을 업데이트했습니다. 확인하십시오.

CGPointZero와 CGRectZero도 그 해결책이 없습니까? 업데이트 된 질문 답변을 업데이트하십시오
niravdesai21

@ niravdesai21 업데이트되었습니다.

4
"CGRectZero는 Swift에서 사용할 수 없습니다"실제로 CGRect 로의 구문 변경 일 때 농담입니다! 이 사람들은 컴파일 경고에 큰 시간을 할애해야합니다 ... 그들은 지속적으로 그들을 구제하기 위해 스택 오버플로에 의존합니다
Magoo

49

Swift3 및 iOS10 에서 CGRectMake, CGPointMake, CGSizeMake 에 대한 빠른 수정

이 확장을 추가하십시오 :

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으로 빠른 변환을 제공하지 않기 때문에이 단계는 시간을 절약 할 수 있습니다.


훌륭한 솔루션!
Oprimus

@Oprimus : 그것은 당신의 번거 로움을 줄일 수 있기를 바랍니다 :)
Rafat touqir Rafsun

26

스위프트 3, 당신은 간단하게 사용할 수 있습니다 CGPoint.zero또는 CGRect.zero대신에 CGRectZero또는 CGPointZero.

그러나 스위프트 4, CGRect.zero'CGPoint.zero'작동


1
@ChewieTheChorkie 당신은 바로 "혼자"만들어 혼란을 만들었습니다.
guru

12

신속한 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)
}

클래스 외부에 배치하면 작동합니다. (적어도 나를 위해 작동)


9

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)

애플 블로그

Swift 3의 Swift 구문 및 API 이름 변경으로 언어가보다 자연스럽게 느껴지고 Cocoa 프레임 워크를 호출 할 때 훨씬 더 빠른 경험을 제공합니다. 널리 사용되는 프레임 워크 Core Graphics 및 Grand Central Dispatch에는 Swift에서 새롭고 훨씬 깨끗한 인터페이스가 있습니다.


5

다음을 시도하십시오 :

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

이것은 스위프트의 최신 버전입니다


그 것처럼 (Y), 이것은 자동 완성이 더 쉬울 것입니다
Husam

5

스위프트 3 보너스 : 왜 짧은 형식을 언급하지 않았습니까?

CGRect(origin: .zero, size: size)

.zero 대신에 CGPoint.zero

유형이 정의되면 안전하게 생략 할 수 있습니다.


2

CGRectZero를 대체하여 사용할 수 있습니다

CGRect.zero

0

Swift 4에서는 아래와 같이 작동합니다

collectionView.setContentOffset(CGPoint.zero, animated: true)

0

CGSize의 경우

CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.