Swift bool 自行更改
Posted
技术标签:
【中文标题】Swift bool 自行更改【英文标题】:Swift bool changes by itself 【发布时间】:2017-02-17 12:16:11 【问题描述】:我有这个奇怪的错误。我有一个名为CalendarAccess
的全局Bool
:
var EventStore: EKEventStore!
var Calendar: NSCalendar!
var CalendarAccessRequestComplete = false
var _CalendarAccess = false
var CalendarAccess: Bool
set(value)
_CalendarAccess = value;
get
return _CalendarAccess;
如您所见,我为它创建了一个 setter 和 getter,这样我就可以设置一个断点来查看它的设置位置。我这样做了,每次遇到断点时,值都是true
。我确定我从来没有直接设置_CalendarAccess
,因为直到现在这个变量才被称为CalendarAccess
。
但是,当我在视图控制器中执行以下操作时,CalendarAccess
是 false
!
@IBAction func saveEvent(_ sender: Any)
if(CalendarAccess)
let event = EKEvent(eventStore: EventStore)
event.title = "My Event"
event.startDate = Date();
event.endDate = Calendar.date(byAdding: .hour, value: 1, to: Date(), options: .matchFirst)!
event.notes = "A note"
event.calendar = EventStore.defaultCalendarForNewEvents
do
try EventStore.save(event, span: .thisEvent)
catch
print("Unable to save event")
else
ErrorAlert(title: "No calendar access", text: "Please give the app access to your calendar. You can do that in your ios device's settings.")
我不知道这怎么可能——变量是一个全局变量,与任何视图或控制器都没有任何关系。
最后一个代码块来自的控制器以模态方式呈现,如果该信息有用的话。
编辑: CalendarAccess
仅设置在一个地方(AppDelegate):
func updateCalendarAccess()
Calendar = NSCalendar.current as NSCalendar!
CalendarAccessRequestComplete = false
EventStore = EKEventStore()
EventStore.requestAccess(to: .event, completion:
(access: Bool, e: Error?) in
CalendarAccessRequestComplete = true
CalendarAccess = access;
return
)
while(!CalendarAccessRequestComplete)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
// Override point for customization after application launch.
updateCalendarAccess()
return true
编辑:我在点击调用@IBAction func saveEvent
的按钮时收到这些消息:
2017-02-17 13:58:00.980237 Calendar[16695:5163026] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-02-17 13:58:00.989165 Calendar[16695:5163026] [MC] Reading from public effective user settings.
编辑:当我关闭模态显示的视图控制器(具有saveEvent
函数的那个)并记录CalendarAccess
的值时,它又是真的。并且 setter 断点没有命中。
编辑:当我展示 VC 时,_CalendarAccess
的值似乎回到了初始值。如果我将var _CalendarAccess = false
更改为var _CalendarAccess = true
,那么当VC 出现时它是正确的。此外,当 VC 出现时,Calendar
变量是 nil
,否则不是。
【问题讨论】:
是什么确切地让您认为_CalendarAccess
变成了真的?您可以发布一个(最小的)self-contained 示例来演示该问题吗? setter 方法中的断点是否命中?如果是——调用堆栈是什么?也许它只是调试器显示垃圾?将 print(_CalendarAccess)
添加到 setter 和 getter。
所以我在_CalendarAccess = true
行下方添加了print(_CalendarAccess)
。在调用saveEvent
函数之前打印一次true
。但是,我仍然收到错误警报。
您在 func saveEvent 中的代码询问 CalenderAccess。 getter 返回您设置为 false 的 _CalendarAccess 的值。除非您实际上将 _CalendarAccess 设置为 true,否则它将始终返回 false。
@Magnas,我确实设置了CalendarAccess
。
@edvinHolm:我在你的代码中看不到_CalendarAccess = true
...请看看如何创建minimal reproducible example,即我们可以的一些代码编译并重现问题。
【参考方案1】:
项目包含同名框架,这导致编译器在多个位置查找相同的值。删除框架,问题解决:)
【讨论】:
以上是关于Swift bool 自行更改的主要内容,如果未能解决你的问题,请参考以下文章
尝试更改 Bool 属性时出现 EXC_BAD_ACCESS 错误