Подтвердить что ты не робот

Является 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 или почему компилятор считает, что они есть?

4b9b3361

Ответ 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 или другие "структуры".