In Swift, you can declare and initialize an empty Dictionary with type String for keys and type Any for values in 4 different ways:
- var myDic1 = [String : Any]()
- var myDic2 = Dictionary<String, Any>()
- var myDic3: [String : Any] = [:]
- var myDic4: Dictionary<String, Any> = [:]
These will all give you the same result which is an empty Dictionary with Strings as the keys and Anys as the values.
[String : Any] is just shorthand for Dictionary<String, Any>.  They mean the same thing but the shorthand notation is preferred.
In cases 1 and 2 above, the types of the variables are inferred by Swift from the values being assigned to them.  In cases 3 and 4 above, the types are explicitly assigned to the variables, and then they are initialized with an empty dictionary [:].
When you create a dictionary like this:
var myDic5 = [:]
Swift has nothing to go on, and it gives the error: 
Empty collection literal requires an explicit type
Historical Note: In older versions of Swift, it inferred [:] to be of type NSDictionary.  The problem was that NSDictionary is an immutable type (you can't change it).  The mutable equivalent is an NSMutableDictionary, so these would work:
var myDic6: NSMutableDictionary = [:]
or
var myDic7 = NSMutableDictionary()
but you should prefer using cases 1 or 3 above since NSMutableDictionary isn't a Swift type but instead comes from the Foundation framework.  In fact, the only reason you were ever able to do var myDic = [:] is because you had imported the Foundation framework (with import UIKit, import Cocoa, or import Foundation).  Without importing Foundation, this was an error.