我在我的功能中有这些定义
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将'testStr'和'testStrLen'移动到类级别,它将无法编译.它说'MyClass.Type没有名为'testStr'的成员.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我不想每次都计算一次不断的"测试".
根据我对以下评论的理解,我需要这样做:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法我不需要输入/输入"test"两次?谢谢.
Mar*_*lme 175
也许在Swift中为一个类声明常量的一个很好的习惯是使用一个名为MyClassConstants的结构,如下所示.
struct MyClassConstants{
static let testStr = "test"
static let testStrLength = countElements(testStr)
static let arrayOfTests: [String] = ["foo", "bar", testStr]
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您的常量将在声明的构造中进行范围化,而不是全局浮动.
我添加了一个静态数组常量,以响应询问静态数组初始化的注释.请参阅"Swift编程语言"中的数组文字.
请注意,字符串文字和字符串常量都可用于初始化数组.但是,由于数组类型已知,testStrLength因此不能在数组初始值设定项中使用整数常量.
Cle*_*rem 68
加入@ Martin的回答......
如果有人计划保持应用程序级别的常量文件,您可以根据其类型或性质对常量进行分组
struct Constants {
struct MixpanelConstants {
static let activeScreen = "Active Screen";
}
struct CrashlyticsConstants {
static let userType = "User Type";
}
}
Run Code Online (Sandbox Code Playgroud)
致电: Constants.MixpanelConstants.activeScreen
Chr*_*ver 14
如果我正确理解你的问题,你就会问你如何创建类级别常量(静态 - 用C++的说法),这样你就不会a)复制每个实例的开销,而b必须重新计算其他的常量.
语言已经发展 - 正如每个读者都知道的那样,但是当我在Xcode 6.3.1中测试它时,解决方案是:
import Swift
class MyClass {
static let testStr = "test"
static let testStrLen = count(testStr)
init() {
println("There are \(MyClass.testStrLen) characters in \(MyClass.testStr)")
}
}
let a = MyClass()
// -> There are 4 characters in test
Run Code Online (Sandbox Code Playgroud)
我不知道静态是否是严格必要的,因为编译器肯定只将每个const变量的一个条目添加到二进制的静态部分,但它确实会影响语法和访问.通过使用静态,即使您没有实例,也可以引用它:MyClass.testStrLen.
Nat*_*ook 11
如果你真的想要你的类的静态属性,那么Swift目前不支持.目前的建议是通过使用全局常量来解决这个问题:
let testStr = "test"
let testStrLen = countElements(testStr)
class MyClass {
func myFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望这些是实例属性,则可以使用延迟存储属性作为长度 - 它将仅在第一次访问时进行评估,因此您不会反复计算它.
class MyClass {
let testStr: String = "test"
lazy var testStrLen: Int = countElements(self.testStr)
func myFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
那么使用计算属性呢?
class MyClass {
class var myConstant: String { return "What is Love? Baby don't hurt me" }
}
MyClass.myConstant
Run Code Online (Sandbox Code Playgroud)
有些人可能希望某些类常量公开,而其他类私有.
private关键字可用于限制同一swift文件中的常量范围.
class MyClass {
struct Constants {
static let testStr = "test"
static let testStrLen = testStr.characters.count
//testInt will not be accessable by other classes in different swift files
private static let testInt = 1
}
func ownFunction()
{
var newInt = Constants.testInt + 1
print("Print testStr=\(Constants.testStr)")
}
}
Run Code Online (Sandbox Code Playgroud)
其他类将能够访问您的类常量,如下所示
class MyClass2
{
func accessOtherConstants()
{
print("MyClass's testStr=\(MyClass.Constants.testStr)")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
112324 次 |
| 最近记录: |