2012-06-19 36 views
27

Tôi muốn đảm bảo rằng CGSize nhỏ hơn hoặc bằng CGSize khác. như:Làm thế nào để so sánh hai biến CGSize?

CGSize firstSize = CGSizeMake(1.0,1.0); 
CGSize secondSize = CGSizeMake(5.0,3.0); 
if(firstSize <= secondSize){ 
    Do Stuff . . . 
} 

Làm cách nào để so sánh?

+6

Nó phụ thuộc vào cách bạn định nghĩa "nhỏ hơn". Vì bạn có hai chiều, cả hai có phải nhỏ hơn không? Hay chỉ là chiều cao? Chỉ cần chiều rộng? Hoặc có lẽ là khu vực của hình chữ nhật được xác định? – lnafziger

+0

nhỏ hơn ít nhất 1 kích thước nhỏ hơn trong khi thứ nguyên thứ hai không lớn hơn (có thể bằng nhau). –

+0

Được rồi, vậy tổng diện tích không quan trọng? Nếu bạn có một hộp 100x100 và một hộp khác là 101x25, thì theo định nghĩa của bạn, nó lớn hơn? – lnafziger

Trả lời

18

Xác định xem firstSize phù hợp với secondSize mà không xoay:

if(firstSize.width <= secondSize.width && firstSize.height <= secondSize.height) 
+0

Thực ra, điều này sẽ đúng nếu chúng có cùng kích thước. Anh ta muốn "nhỏ hơn" trong ít nhất một chiều. – lnafziger

+1

@Inafziger: "nhỏ hơn * hoặc bằng *" –

+0

@KevinBallard đọc nhận xét đầu tiên của mình: "ít nhất một kích thước nhỏ hơn ...." – lnafziger

3
if(firstSize.width <= secondSize.width && firstSize.height <= secondSize.height && 
    firstSize.width*firstSize.height < secondSize.width*secondSize.height) 
102

Để kiểm tra sự bình đẳng, bạn có thể sử dụng, CGSizeEqualToSize chức năng bởi Apple.

CGSize firstSize = CGSizeMake(1.0,1.0); 
CGSize secondSize = CGSizeMake(5.0,3.0); 

if(CGSizeEqualToSize(firstSize, secondSize)) { 
    //they are equal 
}else{ 
    //they aren't equal 
} 
+9

Dvir Levy tìm kiếm "nhỏ hơn hoặc bằng" như mô tả trong câu hỏi. Trong trường hợp 'CGSizeEqualToSize()' trả về false, chúng ta vẫn không biết nó lớn hơn hay nhỏ hơn. – Anne

4

Hàm sau xác định nếu hình chữ nhật của CGSize trong tham số đầu tiên khớp hoàn toàn trong hoặc ở mức độ hình chữ nhật của CGSize trong tham số thứ hai.

- (BOOL)size:(CGSize)smallerSize isSmallerThanOrEqualToSize:(CGSize)largerSize { 

    return CGRectContainsRect(
     CGRectMake(0.0f, 0.0f, largerSize.width, largerSize.height), 
     CGRectMake(0.0f, 0.0f, smallerSize.width, smallerSize.height) 
    ); 
} 

Thay vì viết toàn bộ logic với khó đọc câu lệnh có điều kiện, bạn có thể sử dụng hàm dựng sẵn nội tuyến có tên mô tả.

Trong khi tôi chưa thực hiện nghiên cứu, phương pháp này có thể chậm hơn trong thực thi so với câu trả lời được chấp nhận vì nó liên quan đến việc chuyển đổi hai CGSizes thành hai cấu trúc CGRects C. Mặc dù nó có lợi thế là nhanh hơn để hiểu bởi người đọc.

0

Tiện ích mở rộng chuyển tiếp khá thẳng cho Swift 4.0 trên CGSize. Khi các trạng thái OP, điều này giả định rằng bạn quan tâm đến kích thước và không phải là khu vực.

import UIKit 

extension CGSize { 
    func isGreaterOrEqual(to size: CGSize) -> Bool { 
     return width >= size.width && 
      height >= size.height 
    } 
} 

Sau đó bạn có thể thử nghiệm nó với các giá trị sau:

let size = CGSize(width: 100, height: 100) 
let smaller = CGSize(width: 80, height: 80) 
let bigger = CGSize(width: 120, height: 120) 

let small = size.isGreaterOrEqual(to: smaller) // true 
let big = size.isGreaterOrEqual(to: bigger) // false 
let same = size.isGreaterOrEqual(to: size) // true 
Các vấn đề liên quan