我是在 Xcode 上編碼和使用 SwiftUI 的新手,我看不出這段代碼有什么問題:
class NormalSpace {
var name = ""
var value = 0
var rent = 0
var owned = false
}
var newRoad = NormalSpace()
newRoad.name = "New Road"
newRoad.value = 600
newRoad.rent = 25
newRoad.owned = false
錯誤“實體方法宣告中的預期 'func' 關鍵字”僅顯示在 newRoad.name 行上。同一行也有錯誤:'newRoad' 的重新宣告無效。
我做錯了什么?
uj5u.com熱心網友回復:
在正常專案中,這是無效的:
class NormalSpace {
var name = ""
var value = 0
var rent = 0
var owned = false
}
var newRoad = NormalSpace()
newRoad.name = "New Road"
newRoad.value = 600
newRoad.rent = 25
newRoad.owned = false
您可以在 Playground(它直接運行此代碼)中執行此操作,但在應用程式中,代碼(例如屬性的設定)屬于函式或初始化程式。
該初始化代碼需要放在某個背景關系中。讓我們想象它在一個struct. 但這仍然無效:
class NormalSpace {
var name = ""
var value = 0
var rent = 0
var owned = false
}
struct Foo {
var newRoad = NormalSpace()
newRoad.name = "New Road"
newRoad.value = 600
newRoad.rent = 25
newRoad.owned = false
}
該屬性newRoad很好,但值不是。您需要將其包裝在 a func(因此出現錯誤)或init. 例如,這在的newRoad期間初始化:initstruct
struct Foo {
let newRoad: NormalSpace
init() {
newRoad = NormalSpace()
newRoad.name = "New Road"
newRoad.value = 600
newRoad.rent = 25
newRoad.owned = false
}
}
或者您可以將其初始化為func:
struct Foo {
var newRoad: NormalSpace?
mutating func bar() {
let road = NormalSpace()
road.name = "New Road"
road.value = 600
road.rent = 25
road.owned = false
newRoad = road
}
}
()或者,或者,您可以使用閉包初始化此屬性(注意末尾的額外內容):
struct Foo {
let newRoad: NormalSpace = {
let road = NormalSpace()
road.name = "New Road"
road.value = 600
road.rent = 25
road.owned = false
return road
}()
}
但是初始化屬性的代碼必須放在某個背景關系中,以便編譯器知道何時應該運行這些代碼行。
注意,我們通常會給出NormalSpace一個“成員初始化器”,例如:
class NormalSpace {
let name: String
let value: Int
let rent: Int
let owned: Bool
init(name: String, value: Int, rent: Int, owned: Bool) {
self.name = name
self.value = value
self.rent = rent
self.owned = owned
}
}
或者,如果一個struct(并且我們通常更愿意讓我們的模型物件struct為值型別而不是class參考型別),則將為您創建這個成員初始化器:
struct NormalSpace {
let name: String
let value: Int
let rent: Int
let owned: Bool
}
無論哪種方式,您都可以在初始化期間提供所有所需的值,例如:
struct Foo {
let newRoad = NormalSpace(name: "New Road", value: 600, rent: 25, owned: false)
}
請注意,我洗掉了“默認”值,因為它們確實不合適。如果您想說不需要提供它們,那么您可以將它們設為“可選”。但是一般來說,零租金(即這是我祖母的房子,她不向我收費)和沒有指定租金之間存在很大差異。在 Swift 中,我們通常避免使用“哨兵”值,例如""或0表示“沒有提供值”。
此外,現在我們有了一個成員初始化器,我還使屬性不可變(let而不是var)。如果您需要使它們可變(例如讓某人稍后更改租金),可以,恢復為var. 但只有在您以后確實需要更改它們時才使屬性可變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476594.html
