// some code for testing
class C { } // just a simple class as an example for a reference type
var c = C()
var d: Double = 0.9 // a value type
Решение 1 через extension
protocol ValueType { }
extension Double : ValueType { }
extension Int : ValueType { }
// ... all value types to be added
func printT1 <T: ValueType> (input: T) {
println("\(input) is value")
}
printT1(d) // Does work
//printT1(c) // Does not work
Но, как упоминалось в комментариях, это работает, но неосуществимо, потому что определяемые пользователем типы значений должны реализовывать этот протокол.
Решение 2 через подпись метода
func printT <T: AnyObject> (input: T) {
println("\(input) is reference")
}
func printT <T: Any> (input: T) {
println("\(input) is value")
}
Решение 3 через assert
Другое решение может быть через assert
func printT <T: Any> (input: T) {
print("\(input) is " + ((T.self is AnyObject) ? "reference" : "value"))
}
«Решение» 4 через пункты where
Это будет лучшим решением, я думаю. К сожалению, нет возможности иметь
func printT <T: Any where T: ~AnyObject > (input: T) {
println("\(input) is value")
}
или похожие. Возможно, это будет возможно в будущих версиях Swift.
person
Michael Dorner
schedule
28.02.2015
isUniquelyReferenced()
, чтобы увидеть, можете ли вы получить утверждения во время выполнения вашей основной цели (что, как я предполагаю, является уверенностью в том, что объект не может измениться после вашего назад). Я бы обязательно поднял ваш вариант использования на форумах разработчиков (devforums.apple.com/community/tools /languages/swift). Это очень интересный вопрос. - person Rob Napier   schedule 28.02.2015UnsafeMutablePointer
— это тип структуры, на которую можно изменять состояние, на которое она указывает, не изменяя саму структуру. Разве это не ссылочный тип? Поведение ссылочного типа может быть встроено в типы структур, поэтому вы ничего не избегаете, исключая ссылочные типы. - person newacct   schedule 12.01.2016class
es иstruct
s, а далее вы найдете Структуры и перечисления являются типами значений и Классы являются ссылочными типами. - person Slipp D. Thompson   schedule 23.02.2017UnsafeMutablePointer
не является ссылочным типом — это тип значения, который имеет адрес памяти в качестве своих данных. Этот адрес памяти может использоваться в качестве ссылки в специальном режиме, но экземплярUnsafeMutablePointer
остается типом значения. Самое главное, что использование ad-hoc не является обычным «родным» способом использования Swift —UnsafeMutablePointer
предоставляется в первую очередь в качестве моста для возможности использования C API, и поэтому Swift должен иметь стороннюю поддержку для всех сумасшествие C-указателя, которое может сделать C. - person Slipp D. Thompson   schedule 23.02.2017