2016-09-06 16 views
6

Tôi đã sử dụng dateByAddingComponents:toDate:options:dateByAddingUnit:value:toDate:options: và sử dụng tùy chọn ràng buộc để có được ngày ra khỏi nó. Như thế này:Khi nào dateByAddingComponents: toDate: tùy chọn trả về nil?

guard let startOfNextMonth = calendar.dateByAddingComponents(oneMonthComponent, toDate: startOfThisMonth, options: []) else { 
    return nil 
} 

đâu oneMonthComponent chỉ là một NSDateComponent với giá trị tháng thiết lập để 1.

Khi tôi đọc về nó, trong tài liệu cả hai đều nói điều gì đó như:

Returns nil nếu ngày nằm ngoài phạm vi được xác định của người nhận hoặc nếu không thể thực hiện tính toán.

Và tôi đã tự hỏi, khi nào chính xác là nguyên nhân gây ra. Nếu tôi chỉ thêm một tháng vào một ngày, có cách nào có thể là không? Đây có phải là vì một số khác biệt trong các hệ thống lịch khác, khi thêm một số đơn vị không có ý nghĩa?

Tôi đã tìm kiếm xung quanh và không thể tìm thấy một trường hợp mà nó sẽ trả lại không.

Có điều gì có thể làm cho mã ở trên không phải là không? Ví dụ khi thêm thành phần có thể là gì?

+0

Lưu ý rằng trong Swift> = 3, tên phương thức là 'date (byAdding: to: options:)'. –

Trả lời

3

Trong thực tế, nếu bạn chỉ thêm một tháng vào một ngày, bạn sẽ không nhận được các giá trị nil.

Tuy nhiên, bạn có thể nhận được giá trị nil trong một số trường hợp thoái hóa. Ví dụ: nếu bạn đang sử dụng lịch Hồi giáo và thêm -9,999,999 năm, bạn sẽ nhận được một nil (mặc dù, tò mò, không phải trong các lịch khác). Các lịch khác thường sẽ tràn/quấn năm trong những tình huống cực đoan này (mặc dù bạn mong đợi họ trả lại nil, với tài liệu bạn trích dẫn).

Cá nhân, tôi cho rằng hiện tại có rất ít trường hợp bạn sẽ nhận được các giá trị nil. Tôi đã thử tất cả các loại giá trị cực đoan và lịch Hồi giáo là người duy nhất mà tôi đã thành công trong việc nhận được một giá trị nil. Mặc dù vậy, điều này không có nghĩa là Apple có thể không thêm lôgic xác nhận ngày mạnh mẽ hơn trong tương lai. Chúng tôi có lẽ sẽ phải nhận được lời khuyên từ Apple (hoặc xem mã nguồn cho NSCalendar) để trả lời câu hỏi này dứt khoát.

Vì vậy, dòng dưới cùng, tôi khuyên bạn nên giữ câu hỏi guard của mình, nhưng không chắc sẽ thất bại trong các tình huống trong thế giới thực.

Các vấn đề liên quan