2016-12-29 11 views
1
protocol ValueHolder { 
} 

struct A: ValueHolder { 
    var value = 5 
} 

var x: ValueHolder = A() 

func f(a: inout A) { 
    a.value = 10 
} 

Я хочу использовать пропуск x для f. Является ли это возможным?Тип протокола быстрого ввода для структурирования и передачи как inout

Редактировать: Я понимаю весь персонал о семантике значений и параметрах inout. Проблема в том, что x необходимо отправить в A, и мне интересно, можно ли это сделать без его копирования (as делает типизированную копию), так что я могу использовать f по адресу x.

+0

Что касается компилятора, то 'x' имеет тип' ValueHolder' и не имеет ничего общего с 'A', поэтому вы не можете называть' f'. – luk2302

+0

Еще один хороший пример для комментариев большего типа, чем хороших аннотаций типа. Удалите аннотацию типа 'x', затем вы можете вызывать' f (a: & x) 'и' x.value' prints 10 – vadian

+1

Если вы объясните, почему вы хотите это сделать, может появиться альтернативное решение. –

ответ

3

Я хочу использовать пропуск x (а не его копию) в f. Является ли это возможным?

Не совсем - по крайней мере, если параметр является A. A - это структура. Даже с inout структура по-прежнему является типом значения. inout позволяет заменить исходное значение, но заменить его на другое. Проще говоря, структура не может быть изменена на месте.

Это так, ваш вопрос, кажется, теряет смысл. Поскольку структура не может быть мутирована на месте, нет реальной причины использовать здесь inout. Вы ничего не делаете, что звонит за inout. Вы можете также просто уронить inout и принять значение семантики:

func f(a: A) -> A { 
    var a = a 
    a.value = 10 
    return a 
} 
x = f(a:x as! A) 

Если вы действительно хотите сохранить inout, затем введите a: как ValueHolder и бросьте внутри функции, например:

var x: ValueHolder = A() 
func f(a: inout ValueHolder) { 
    var b = a as! A 
    b.value = 10 
    a = b 
} 
f(a:&x) 
(x as! A).value // 10 
+1

Обратите внимание, что во многих случаях параметр 'inout' может быть оптимизирован для передачи по ссылке, что позволяет мутировать структуру« на месте ». – Hamish

+0

@matt Да, но все, что я хочу, это изменить 'x' (так что факт, что передача его как параметра' inout', скорее всего, полностью заменит его, а не изменяет его на месте, это нормально, это не проблема здесь). – timaktimak

+0

Хорошо, но это не то, о чём задавался ваш вопрос, в то время, когда я ответил на него. – matt