AnyObject và Any trong Swift


90

Tôi không hiểu khi nào thì sử dụng AnyObject và khi nào thì sử dụng Any trong Swift.

Trong trường hợp của tôi, tôi có một Từ điển

[Chuỗi: ???]

??? : Có thể là Int, Double, Float, String, Array, Dictionary

Ai đó có thể giải thích cho tôi sự khác biệt giữa Any và AnyObject và cái nào nên sử dụng trong trường hợp của tôi không.

Alak

Câu trả lời:


113

AnyObjectchỉ dành cho kiểu tham chiếu (lớp), Anydành cho cả kiểu giá trị và kiểu tham chiếu.

Vì vậy, bạn nên đi cho [String: Any].

Nhập Casting cho Any và AnyObject

Swift cung cấp hai kiểu đặc biệt để làm việc với các kiểu không cụ thể:

  • Any có thể đại diện cho một thể hiện của bất kỳ kiểu nào, bao gồm cả các kiểu hàm.
  • AnyObject có thể đại diện cho một thể hiện của bất kỳ loại lớp nào.

GHI CHÚ:

Sử dụng AnyAnyObjectchỉ khi bạn cần rõ ràng hành vi và khả năng mà họ cung cấp. Tốt hơn hết là bạn nên nói cụ thể về các kiểu bạn muốn làm việc trong mã của mình.

Từ ngôn ngữ lập trình Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Cũng lưu ý rằng khi bạn làm việc với Cocoa API, bạn thường nhận được Mảng của AnyObject, điều này là do Mảng Objective-C KHÔNG được định dạng. Vì vậy, bạn cần ép chúng sang kiểu mảng mà bạn mong đợi.

-

CHỈNH SỬA: (ngày 22 tháng 12 năm 2015)
Trong tuyên bố cuối cùng, hãy lưu ý rằng điều này đang thay đổi với Swift 2.0 và Xcode 7.
Apple đã giới thiệu chung 'Lightweight' trong Objective-C nên rất nhiều API Cocoa hiện đã trả về đúng loại.

CHỈNH SỬA: (ngày 18 tháng 10 năm 2016)
Lưu ý rằng kể từ Swift 3.0, Objective-C idhiện nay được nhập dưới dạng Any, không còn là AnyObject.


18
Lưu ý rằng String, ArrayDictionarykhông phải là các lớp, cho những sử dụng Bất kỳ.
zaph

6
Int, Double và Float cũng vậy.
Teejay

11
Vâng, nhưng điều đó thường là hiển nhiên. Không phải là quá rõ ràng rằng NSString, NSArrayNSDictionarylà các lớp nhưng các phiên bản Swift có chức năng tương tự không phải là các lớp và điều đó có lợi cho nhiều nhà phát triển.
zaph

1
Có bất kỳ đại diện cho tùy chọn quá không? Hay điều đó nên được thể hiện dưới dạng Bất kỳ?

1
@robdashnash Bất kỳ không đại diện cho các tùy chọn. ? nên được thêm vào để làm cho nó trở thành tùy chọn
crypt

46

Bạn sử dụng Anyhay AnyObjectphụ thuộc vào mục đích sử dụng của bạn:

Nếu từ điển của bạn sẽ chỉ được sử dụng trong vòng Swift mã, sau đó bạn nên sử dụng Anyvì các loại của bạn ( Int, Double, Float, String, Array, và Dictionary) không phải là đối tượng.

Nếu bạn sẽ chuyển từ điển của mình sang các thói quen Objective-C mà mong đợi một NSDictionary, thì bạn nên sử dụng AnyObject.

Khi bạn import Foundationhay import UIKithay import Cocoa, người ta có thể khai báo mảng của bạn như [String: AnyObject], nhưng trong trường hợp này Swift được xử của bạn Int, Double, Floatliterals như NSNumber, bạn Strings như NSString, bạn Arraynhư là NSArray, và từ điển của bạn như NSDictionary, tất cả trong số đó là các đối tượng. Từ điển sử dụng AnyObjectlàm kiểu giá trị có thể chuyển đổi thành NSDictionary, nhưng từ điển sử dụng Anythì không.


1

Theo tài liệu Swift của Apple,

  • Bất kỳ có thể đại diện cho một thể hiện của bất kỳ loại nào, bao gồm các loại hàm và các loại tùy chọn.
  • AnyObject có thể đại diện cho một thể hiện của bất kỳ loại lớp nào.

Để biết thêm chi tiết, vui lòng kiểm tra sau: Blog


1

Kiểm tra câu trả lời SO này :

Generics là loại an toàn, có nghĩa là nếu bạn chuyển một chuỗi dưới dạng chung và cố gắng sử dụng như một số nguyên, trình biên dịch sẽ phàn nàn và bạn sẽ không thể biên dịch của bạn (điều đó là tốt). (Điều này xảy ra vì Swift đang sử dụng kiểu gõ tĩnh và có thể gây ra lỗi trình biên dịch cho bạn). Nếu bạn sử dụng AnyObject, trình biên dịch không biết đối tượng này có thể được coi là Chuỗi hay là Số nguyên và về cơ bản sẽ cho phép bạn làm bất cứ điều gì bạn muốn với nó (điều đó thật tệ) như thể bạn cố gắng sử dụng một đối tượng đã được được truyền dưới dạng Chuỗi khi nó là Số nguyên, ứng dụng sẽ gặp sự cố. (Điều này xảy ra vì Swift đang sử dụng Nhập động và sẽ chỉ gây ra lỗi thời gian chạy cho bạn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.