【问题标题】:Swift: How to declare a property with classes' namesSwift:如何用类名声明属性
【发布时间】:2016-05-18 10:18:46
【问题描述】:

例如,这个 sn-p 取自 Swift 中的UIColor 定义:

// Access the underlying CGColor or CIColor.
public var CGColor: CGColor { get }

但是,在我自己的班级中尝试对 NSError 做同样的事情会导致错误:

public class MyClass {
    public var NSError: NSError {
        return NSError(domain: "mydomain", code: 0, userInfo: [:])
    }
}

var 行显示Use of undeclared type 'NSError'

这还有可能吗?有什么好的方法可以做到这一点?

苹果 Swift 2.2 版 (swiftlang-703.0.18.1 clang-703.0.29)
目标:x86_64-apple-macosx10.9

【问题讨论】:

  • 通过简单的Foo 类确认

标签: swift


【解决方案1】:

可以通过为NSErrorNSErrorRef 创建一个typealias 来做到这一点。然后,您将在整个类中引用此类型别名,因为 NSError 现在将引用属性,而不是类。

public typealias NSErrorRef = NSError

public class MyClass {
    public var NSError:NSErrorRef {
        return NSErrorRef(domain: "", code: 0, userInfo: nil)
    }
}

但是,我从不推荐这个。

我怀疑CGColorUIColor 的Swift 标头中以这种方式命名的唯一原因只是为了保持与Objective-C 的互操作性。至于为什么它可以正常工作而没有任何令人困惑的错误——我不能说。虽然,如果您实际上查看UIColor的文档,您将看到CGColor is actually listed as cgColor(选择Swift时) - 甚至显示甚至Apple认为它没有定义正确!

在任何情况下,约定都规定属性应该以小写字母开头(首先是为了防止这种混淆)。所以你可以这样做:

public class MyClass {
    public var nsError:NSError {
        return NSError(domain: "", code: 0, userInfo: nil)
    }
}

或者更好的是,你可以将你的属性命名为error——因为无论如何在 Swift 中应该很少使用前缀(除非你需要消除歧义——你实际上似乎需要这样做)。

public class MyClass {
    public var error:NSError {
        return NSError(domain: "", code: 0, userInfo: nil)
    }
}

【讨论】:

  • 该类实际上是一个错误类,因此普通的error 属性没有多大意义。我想提供访问器来获取NSError 因此这个问题。无论如何,谢谢你的回答!!!
  • @chakrit 嗯,nsError 在这种情况下非常有意义,可以消除歧义。很高兴能提供帮助:)
猜你喜欢
  • 2018-09-14
  • 2013-01-02
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多