Điều này không hoàn toàn trùng lặp - có một số sự tinh tế với các tùy chọn không được mở hoàn toàn trong các chữ ký chức năng ngoài việc sử dụng chúng ở nơi khác.
Bạn thấy các tùy chọn không được mở hoàn toàn trong API được nhập từ ObjC vì đó là xấp xỉ gần đúng nhất Swift của một đối tượng được mong đợi ở đó nhưng có thể là không. Đó là một sự thỏa hiệp cho API được nhập - bạn có thể xử lý các biến này trực tiếp như trong ObjC và bạn có thể kiểm tra chúng cho nil bằng cú pháp tùy chọn Swift. (Có nhiều hơn về lý do của Apple cho điều này trong Advanced Interoperability talk từ WWDC14.) Mẫu này cũng áp dụng cho các khai báo IBAction
được chèn bởi Trình tạo giao diện, vì các phương thức đó có hiệu lực cũng được gọi từ mã ObjC. Khi bạn dường như đã nghi ngờ, Swift sẽ kết thúc tốt nhất có thể trong một tùy chọn khi bắc cầu từ ObjC, nhưng !
trong khai báo triển khai chức năng của bạn sẽ mở khóa giá trị để bạn có thể sử dụng nó trực tiếp. (Có nguy cơ của riêng bạn.)
Kể từ Swift 1.2 (Xcode 6.2 vào mùa xuân 2015), API ObjC có thể được chú thích với nonnull
và nullable
, trong trường hợp giao diện Swift cho các API đó sử dụng loại không bắt buộc hoặc loại tùy chọn hoàn toàn. (Và kể từ Swift 2.0/Xcode 7.0, gần như tất cả các API của Apple đều được kiểm tra để sử dụng chú thích vô hiệu, vì vậy chữ ký Swift của chúng không sử dụng nhiều hơn !
nữa.)
Điều ít nổi tiếng hơn về điều này là bạn tự do thay đổi tùy chọn tham số khi bạn triển khai các hàm Swift của riêng bạn mà ObjC gọi. Nếu bạn muốn trình biên dịch thực thi rằng sender
trong phương thức hành động của bạn không bao giờ có thể là 0, bạn có thể loại bỏ loại tham số !
. Nếu bạn muốn trình biên dịch đảm bảo bạn luôn kiểm tra tham số, hãy thay đổi !
thành ?
.
Bạn nói đúng, nhưng kể từ phiên bản beta 6 Apple đã bắt đầu bằng cách nào đó ảnh hưởng đến việc lập bản đồ API của họ. Khi chúng ghi chú trong các ghi chú phát hành: 'Một số lượng lớn các API Foundation đã được kiểm tra cho sự phù hợp tùy chọn, loại bỏ một số lượng đáng kể các tùy chọn được gỡ bỏ hoàn toàn khỏi giao diện của chúng. Điều này làm rõ tính vô dụng của các thuộc tính và các đối số của chúng/các giá trị trả về của các phương thức của chúng. Đây là nỗ lực không ngừng kể từ phiên bản beta 5.' Bất kỳ ý tưởng nào về cách chúng tôi có thể thực hiện tương tự cho các API tùy chỉnh của mình? – Klaas