Является Float, Double, Int AnyObject?
Я прочитал встроенную документацию Swift, и я немного смущен.
1) Any
- это протокол, который все типы неявно соответствуют.
2) AnyObject
- это протокол, к которому все классы неявно соответствуют.
3) Int
, Float
, Double
являются structs
Вот пример кода:
import UIKit
func passAnyObject(param: AnyObject) {
print(param)
}
class MyClass {}
struct MyStruct {}
let a: Int = 1
let b = 2.0
let c = NSObject()
let d = MyClass()
let e = MyStruct()
passAnyObject(a)
passAnyObject(b)
passAnyObject(c)
passAnyObject(d)
//passAnyObject(e) // Argument type 'MyStruct' does not conform to expected type 'AnyObject'
if a is AnyObject { // b, d, e is also AnyObject
print("\(a.dynamicType) is AnyObject")
}
Я не понимаю, почему Int
, Double
, Float
являются AnyObject
s? Почему компилятор ничего не говорит? Эти типы объявляются как структуры. Struct MyStruct
не может быть передан методу сверху, потому что он не соответствует AnyObject
.
Не могли бы вы помочь мне понять, почему Int
, Double
и Float
являются AnyObject
или почему компилятор считает, что они есть?
Ответы
Ответ 1
Поскольку вы импортировали Foundation, Int
, Double
и Float
преобразуются в NSNumber
при передаче функции с AnyObject
. Тип String
преобразуется в NSString
. Это делается для облегчения жизни при вызове интерфейсов Cocoa и Cocoa Touch. Если вы удалите import UIKit
(или import Cocoa
для OS X), вы увидите:
error: argument type 'Int' does not conform to expected type 'AnyObject'
когда вы вызываете
passAnyObject(a)
Это неявное преобразование типов значений в объекты описано здесь.
Обновление для Swift 3 (Xcode 8 beta 6):
Передача Int
, Double
, String
или Bool
в параметр типа AnyObject
теперь приводит к ошибке, такой как Аргумент типа 'Int' не соответствует ожидаемому type 'AnyObject'.
С Swift 3 неявное преобразование типов было удалено. Теперь необходимо передать Int
, Double
, String
и Bool
с помощью as AnyObject
, чтобы передать его параметру типа AnyObject
:
let a = 1
passAnyObject(a as AnyObject)
Ответ 2
Хорошая находка! UIKit
фактически преобразует их в NSNumber
- также упоминается @vacawama. Причина этого заключается в том, что иногда вы работаете с кодом, который возвращает или использует AnyObject
, этот объект можно было бы отличить (as!
) как Int
или другие "структуры".