let asset = NSDataAsset(name: "KanjiDataBase", bundle: Bundle.main)
// получаем полный путь к каталогу Documents
// объект класса NSURL
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let documentUrl = urls.first {
try! asset?.data.write(to: documentUrl.appendingPathComponent("KanjiDataBase.s3db"), options: [.atomic])
}
class MyView: UIView {
let gradient: CALayer
...
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = self.bounds
}
}
private var gradientPropertyKey: UInt8 = 0
extension UIView {
func addNiceGradient() {
let gradient = < тут ваш слой >
layer.addSublayer(gradient)
let observation = layer.observe(\.bounds) { [weak gradient] layer, _ in
gradient?.frame = layer.bounds
}
objc_setAssociatedObject(self, &gradientPropertyKey, observation, .OBJC_ASSOCIATION_RETAIN)
}
}
Есть 7 кнопок в виде чекбокса хочу сделать, что бы выбрать можно было только одну.Это называется RADIOBUTTON.
auth
всего лишь возвращает инстанц класса FIRAuth
Собственно все ваши currentUser
тут присутствуют. Думаю теперь вопросов быть не должно. @implementation FIRAuth {
/** @var _currentUser
@brief The current user.
*/
FIRUser *_currentUser;
/** @var _firebaseAppName
@brief The Firebase app name.
*/
NSString *_firebaseAppName;
/** @var _listenerHandles
@brief Handles returned from @c NSNotificationCenter for blocks which are "auth state did
change" notification listeners.
@remarks Mutations should occur within a @syncronized(self) context.
*/
NSMutableArray<FIRAuthStateDidChangeListenerHandle> *_listenerHandles;
/** @var _keychain
@brief The keychain service.
*/
FIRAuthKeychain *_keychain;
/** @var _lastNotifiedUserToken
@brief The user access (ID) token used last time for posting auth state changed notification.
*/
NSString *_lastNotifiedUserToken;
/** @var _autoRefreshTokens
@brief This flag denotes whether or not tokens should be automatically refreshed.
@remarks Will only be set to @YES if the another Firebase service is included (additionally to
Firebase Auth).
*/
BOOL _autoRefreshTokens;
/** @var _autoRefreshScheduled
@brief Whether or not token auto-refresh is currently scheduled.
*/
BOOL _autoRefreshScheduled;
/** @var _isAppInBackground
@brief A flag that is set to YES if the app is put in the background and no when the app is
returned to the foreground.
*/
BOOL _isAppInBackground;
/** @var _applicationDidBecomeActiveObserver
@brief An opaque object to act as the observer for UIApplicationDidBecomeActiveNotification.
*/
id<NSObject> _applicationDidBecomeActiveObserver;
/** @var _applicationDidBecomeActiveObserver
@brief An opaque object to act as the observer for
UIApplicationDidEnterBackgroundNotification.
*/
id<NSObject> _applicationDidEnterBackgroundObserver;
}
class Auth {
class func auth() -> FIRAuth { ... }
...
}
class FIRAuth {
var currentUser: FIRUser?
...
}
class FIRUser {
var providerData: [Int : {что-то}]
...
}
Auth.auth().currentUser?.providerData[indexPath.row]
FUIAuth.defaultAuthUI()
возвращает опционал. Почему бы и не продолжить цепочку. Продолжаем: FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication)
Но как не странно этот метод тоже возвращает опционал и мы просто хотим себя от этого обезопасить и сказать, что если на последнем методе тоже будет опционал, то верни правую часть, то бишь false. В итоге получаем общую картину: FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (destinationData?[indexPath.row]) != nil {
if(indexPath.row + 1 >= (destinationData?.count)!) {
expandCell(tableView: tableView, index: indexPath.row)
}
else {
if(destinationData?[indexPath.row+1] != nil) {
expandCell(tableView: tableView, index: indexPath.row)
// Close Cell (remove ExpansionCells)
} else {
contractCell(tableView: tableView, index: indexPath.row)
}
}
}
}
/* Expand cell at given index */
private func expandCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
var indexesToInsert = [IndexPath]()
for i in 1...infoMain.count {
destinationData?.insert(nil, at: index + 1)
indexesToInsert.append(IndexPath(row: index + i, section: 0))
}
tableView.insertRows(at: indexesToInsert , with: .left)
tableView.scrollToRow(at: IndexPath(row: index + 1, section: 0), at: .bottom, animated: true)
}
}
/* Contract cell at given index */
private func contractCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
var indexesToDelete = [IndexPath]()
for i in 1...infoMain.count {
destinationData?.remove(at: index + 1)
indexesToDelete.append(IndexPath(row: index + i, section: 0))
}
tableView.deleteRows(at: indexesToDelete, with: .left)
}
}
class Time {
var seconds:Double = 0
init(seconds: Double) {
self.seconds = seconds
}
var minutes: Double {
get {
return (seconds / 60)
}
set {
self.seconds = (newValue * 60)
}
}
var hours: Double {
get {
return (seconds / (60 * 60))
}
set {
self.seconds = (newValue * (60 * 60))
}
}
var days: Double {
get {
return (seconds / (60 * 60 * 24))
}
set {
self.seconds = (newValue * (60 * 60 * 24))
}
}
}
class Printer {
static func mustprint() {
print ("was printed")
}
}
Printer.mustprint()
class Printer {
func mustprint() {
print ("was printed")
}
}
let printer = Printer(); printer.mustprint()