2017-02-15 1 views
2

Я не понимаю, почему система типов позволяет мне это делать?Почему принудительный uwrapped тип с nil не сбой при передаче аргументу функции, который имеет необязательный тип?

Другими словами Я ожидаю, что это сработает, когда foo передается функции.

var foo:String! 

func someFunction(_ bar:String?) { 
    print("-- \(bar) --") 
} 

someFunction(foo) 

=> writes "-- nil --" 
+5

Связанный: [Косвенно развернутый опционально правопреемником в Xcode 8] (http://stackoverflow.com/q/39633481/2976878) - [Swift 3 неправильная строка интерполяции с неявно развернутые OPTIONALS] (HTTP: // stackoverflow.com/q/39537177/2976878). В Swift 3, если IUO могут быть проверены типом в качестве сильных опций, они будут. – Hamish

+0

@ Хамиш вы могли бы разместить это в качестве ответа? – mkorpela

+0

Связано также: http://stackoverflow.com/questions/39633481/implicitly-unwrapped-optional-assign-in-xcode-8. –

ответ

1

Внутри вашего someFunction вы печатаете необязательную строчку. поэтому он не рушится. если вы хотите напечатать панель как String, вам необходимо развернуть значение.

+0

Я предполагаю, что это не то, о чем спрашивает OP, это о том, почему он должен это делать? –

0
// This line will create variable named foo and type of it will be String! and value of it will be nil. 
// It mean i can access this variable is force-wraped so it may dangerous but uses of this variable without type checking compiler will not give any warning(ignore by compiler). 
var foo:String! 

// This function will accept `String` value or `nil`. 
func someFunction(_ bar:String?) { 
    print("-- \(bar) --") 
} 

// So calling this function use of `foo`(valued nil) will not give any compiler issue. 
someFunction(foo) 
2

Как @Hamish так правильно указывает здесь: https://stackoverflow.com/a/39537558/308189

Если выражение может быть явно тип проверяется с сильным дополнительным типом, он будет. Тем не менее, средство проверки типов будет возвращаться к принудительному, если необходимо, дополнительному.

И комментарий на ответ объясняет, почему этот вопрос был задан вопрос:

Как будто это не было достаточно плохо, что вы должны использовать IUO, теперь они менее полезны и ведут себя противоречиво , Если я использую один, это потому, что я хочу, чтобы он был неявно разворачиван. С этого момента их следует называть Schrödinger Optionals. - Андреас

+1

Я голосовал, чтобы закрыть вопрос из-за возможности дублирования, предлагаю вам закрыть его :) –