There is a simple solution that is completely executed without pointer processing:
extension URL { func isAlias() -> Bool? { let values = try? url.resourceValues(forKeys: [.isSymbolicLinkKey, .isAliasFileKey]) let alias = values?.isAliasFile let symbolic = values?.isSymbolicLink guard alias != nil, symbolic != nil else { return nil } if alias! && !symbolic! { return true } return false } }
Explanation: resourceValues(forKeys:) returns .isAliasFile and .isSymbolicLink for symbolic links, so you need to make sure that the former is returned and the latter is not checked for aliases. If the path does not exist, the function returns nil.
source share