>It was a rather frustrating experience because none of my existing knowledge worked.
Well, it is a new language
>I could see the field I needed in the object in the debugger, but for the life of me couldn't figure out how to get it.
I would need more context to help you out here. You had SomeObject with a child SomeChild and couldn't do
let a= SomeObject.SomeChild ? Perhaps I'm misunderstanding.
>I had to write some really weird `if let ...` thing that would extract those fields into local variables that I could then use.
Sounds like this is importing from some file or something, and whoever wrote the code below you just made everything optional and chucked all the responsibility for that up the chain. I'd have to see the code but it sounds like bad design.
>Also, immutable everything by default. You can't overwrite function arguments within the function itself, like you could in Java and C++. And unwrap, unwrap, unwrap, unwrap, unwrap everything.
That's a feature not a bug. Maybe I'm misunderstanding you, but if you have
func twoStrings(a: String, b: String) -> String, _why on earth_ would you ever want to be able to override that func's params and feed it something else? a/b would be a completely unexpected type and blow up/fail to compile. If you're routinely needing to do this, you haven't embraced static typing I think. Swift Generics are a potential option.