CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero ไม่พร้อมใช้งานใน Swift


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และCGPointZeroแทนที่ด้วยCGRect.zeroและในCGPoint.zeroSwift 3.0


คุณยังสามารถบอกวิธีแก้ปัญหาให้ฉันสำหรับ CGSize = CGSizeMake (0,0) ซึ่งไม่ใช่ woking ใน swift 3
niravdesai21

@ niravdesai21 อัพเดทคำถามโปรดตรวจสอบ

CGPointZero และ CGRectZero ยังไม่สามารถแก้ปัญหาใด ๆ อัปเดตคำถามโปรดอัปเดตคำตอบ
niravdesai21

@ niravdesai21 อัปเดตแล้ว

4
"CGRectZero ไม่พร้อมใช้งานใน Swift" เมื่อจริง ๆ แล้วมันเป็นการเปลี่ยนไวยากรณ์ให้ CGRect.zero เป็นเรื่องตลก! พวกเหล่านี้จำเป็นต้องใช้คำเตือนในการรวบรวมครั้งใหญ่ ... พวกเขาพึ่งพา Stack Overflow เพื่อประกันตัวพวกเขาออกมาอย่างต่อเนื่อง
Magoo

49

แก้ไขด่วนสำหรับ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


ทางออกที่ยอดเยี่ยม!
Oprimus

@Oprimus หวังว่ามันจะช่วยลดความยุ่งยากของคุณ :)
Rafat touqir Rafsun

26

ในสวิฟท์ 3 คุณก็สามารถใช้CGPoint.zeroหรือCGRect.zeroในสถานที่หรือCGRectZeroCGPointZero

อย่างไรก็ตามใน Swift 4 CGRect.zeroและ'CGPoint.zero'จะทำงาน


1
@ChewieTheChorkie คุณพูดถูก "สร้าง" สับสนฉันได้ลบมันออกแล้ว
กูรู

12

หากคุณต้องการใช้มันในแบบที่รวดเร็วคุณสามารถใช้ funcs เหล่านี้:

สำหรับ 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

โครงสร้างเช่นเดียวกับสัญลักษณ์อื่น ๆ ทั้งหมดในคอร์กราฟิกส์และ 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-y ที่มากขึ้นเมื่อเรียกใช้เฟรมเวิร์กโกโก้ เฟรมเวิร์กยอดนิยม Core Graphics และ Grand Central Dispatch มีอินเตอร์เฟสที่ใหม่และสะอาดกว่าใน Swift


5

ลองทำสิ่งต่อไปนี้:

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

นี่เป็นเวอร์ชั่นล่าสุดของ swift


เช่นเดียวกับมัน (Y) สิ่งนี้จะง่ายต่อการเติมให้อัตโนมัติ
Husam

5

โบนัส Swift 3:ทำไมไม่มีใครพูดถึงรูปแบบย่อ

CGRect(origin: .zero, size: size)

.zero แทน CGPoint.zero

เมื่อกำหนดประเภทแล้วคุณสามารถละเว้นได้อย่างปลอดภัย



0

ใน Swift 4มันทำงานเหมือนด้านล่าง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.