required init?(coder aDecoder: NSCoder) {
    super.init(coder:aDecoder)
    self.backgroundColor = .clear
}
override func draw(_ rect: CGRect) {
    let c = UIGraphicsGetCurrentContext()!
    c.move(to:CGPoint(x: 0, y: 0))
    c.addLine(to:CGPoint(x: self.bounds.size.width, y: 0))
    c.strokePath()
}



override func drawText(in rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()!
    context.stroke(self.bounds.insetBy(dx: 1.0, dy: 1.0))
    super.drawText(in: rect.insetBy(dx: 5.0, dy: 5.0))
}



protocol ButtonLike {
    func behaveInButtonLikeWay()
}
extension ButtonLike {
    func behaveInButtonLikeWay() {
        // …
    }
}
extension UIButton : ButtonLike {}
extension UIBarButtonItem : ButtonLike {}



extension NSString {
    func substring(from: Int) -> String
    func substring(to: Int) -> String
    // …
}



@interface NSString (NSStringExtensionMethods)
- (NSString *)substringFromIndex:(NSUInteger)from;
- (NSString *)substringToIndex:(NSUInteger)to;
// …
@end



class NewGameController : UIViewController {
    @IBOutlet weak var tableView : UITableView?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView?.dataSource = self // *
    }
}
extension NewGameController : UITableViewDataSource {
    func tableView(_ tableView: UITableView,
        numberOfRowsInSection section: Int) -> Int {
            return 3
    }
    func tableView(_ tableView: UITableView,
        cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            // …
            return cell
    }
}



class MyClass : NSObject {
}
@objc protocol Dummy {
    func woohoo()
}



let mc = MyClass()
if mc.responds(to: #selector(Dummy.woohoo)) {
    (mc as AnyObject).woohoo()
}



@objc protocol Flier {
    @objc optional var song : String {get}
    @objc optional func sing()
}



override func responds(to aSelector: Selector) -> Bool {
    print(aSelector)
    return super.responds(to:aSelector)
}



// Zmiana egzemplarza typu Range na NSRange.
let r = 2..<4
let nsr = NSRange(r) // Dane wyjściowe: (2,2), egzemplarz typu NSRange.
// Zmiana egzemplarza typu NSRange na Range.
let nsr2 = NSRange(location: 2, length: 2)
let r2 = Range(nsr2) // Typ opcjonalny opakowujący Range 2..<4.



let s = "witaj"
let r = (s as NSString).range(of: "ita")
let mas = NSMutableAttributedString(string:s)
mas.addAttributes([.foregroundColor:UIColor.red], range: r)



let arr = ["hej"] as NSArray
let ix = arr.index(of:"ho")
if ix == NSNotFound {
    print("Nie znaleziono.")
}



let s = "witaj"
let ms = NSMutableString(string:s)
ms.deleteCharacters(in:NSRange(location: ms.length-1, length:1))
let s2 = (ms as String) + "cie" // Teraz s2 to obiekt typu String w Swifcie i ma wartość "witajcie".



var s = "witaj, świecie, przywitaj się ze mną"
let r = try! NSRegularExpression(
    pattern: "\\bwitaj\\b",
    options: .caseInsensitive)
s = r.stringByReplacingMatches(
    in: s,
    range: NSRange(s.startIndex..<s.endIndex, in:s),
    withTemplate: "cześć")
// Obiekt s ma teraz postać "cześć, świecie, przywitaj się ze mną".



let d = Date() // Lub podobne wywołanie.
let comp = DateComponents(month:1)
let greg = Calendar(identifier:.gregorian)
let d2 = greg.date(byAdding: comp, to:d) // Typ opcjonalny opakowujący wartość Date.



let greg = Calendar(identifier:.gregorian)
let d1 = DateComponents(calendar: greg, year: 2018, month: 1, day: 1, hour: 0).date!
let d2 = DateComponents(calendar: greg, year: 2018, month: 8, day: 10, hour: 15).date!
let di = DateInterval(start: d1, end: d2)
if di.contains(Date()) { // Czy aktualna data mieści się między dwiema wcześniej zdefiniowanymi?



print(d)
// Dane wyjściowe: 2018-08-10 22:00:00 +0000.
print(d.description(with:Locale.current))
// Dane wyjściowe: Thursday, March 7, 2019 at 1:58:48 PM Central European Standard Time.



let df = DateFormatter()
df.dateFormat = "M/d/y"
let s = df.string(from: Date())
// Dane wyjściowe: 7/31/2018.



let df = DateFormatter()
let format = DateFormatter.dateFormat(
    fromTemplate:"dMMMMyyyyhmmaz", options:0,
    locale:Locale.currentLocale())
df.dateFormat = format
let s = df.string(from:Date())



let df = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "M/d/y"
let d = df.date(from: "31/7/2018") // nil; format daty powinien mieć postać "d/M/y".



let n = UserDefaults.standard.value(forKey:"Score")
// Tutaj n to wartość Optional<Any> zawierająca wartość typu NSNumber.
let i = n as! Int // To jest dozwolone.
let d = n as! Double // To jest dozwolone.



let dec1 = 4.0 as NSDecimalNumber
let dec2 = 5.0 as NSDecimalNumber
let sum = dec1.adding(dec2) // Dane wyjściowe: 9.0.



let pt = CGPoint(
    x: screenbounds.midX + r * cos(rads),
    y: screenbounds.midY + r * sin(rads)
)
// Zastosowanie animacji.
let anim = CABasicAnimation(keyPath:"position")
anim.fromValue = self.position
anim.toValue = pt



let ud = UserDefaults.standard
let c = UIColor.blue
let cdata = try! NSKeyedArchiver.archivedData(
    withRootObject: c, requiringSecureCoding: true)
ud.set(cdata, forKey: "myColor")



class Dog : NSObject {
    var name : String
    var license : Int
    init(name:String, license:Int) {
        self.name = name
        self.license = license
    }
}
let d1 = Dog(name:"Fido", license:1)
let d2 = Dog(name:"Fido", license:1)
let ok = d1 == d2 // Dane wyjściowe: false.



class Dog : NSObject {
    var name : String
    var license : Int
    init(name:String, license:Int) {
        self.name = name
        self.license = license
    }
    override func isEqual(_ object: Any?) -> Bool {
        if let otherdog = object as? Dog {
            return (otherdog.name == self.name &&
                otherdog.license == self.license)
        }
        return false
    }
}
let d1 = Dog(name:"Fido", license:1)
let d2 = Dog(name:"Fido", license:1)
let ok = d1 == d2 // Dane wyjściowe: true.



let n1 = 1 as NSNumber
let n2 = 2 as NSNumber
let n3 = 3 as NSNumber
let ok = n2 == 2 // Dane wyjściowe: true.
let ix = [n1,n2,n3].firstIndex(of:2) // Typ opcjonalny opakowujący wartość 1.



class Dog : NSObject {
    var name : String
    var license : Int
    init(name:String, license:Int) {
        self.name = name
        self.license = license
    }
    override func isEqual(_ object: Any?) -> Bool {
        if let otherdog = object as? Dog {
            return (otherdog.name == self.name &&
                otherdog.license == self.license)
        }
        return false
    }
    override var hash: Int {
        var h = Hasher()
        h.combine(self.name)
        h.combine(self.license)
        return h.finalize()
    }
}
var set = Set<Dog>()
set.insert(Dog(name:"Fido", license:1))
set.insert(Dog(name:"Fido", license:1))
print(set.count) // Dane wyjściowe: 1.



let marr = NSMutableArray()
marr.add(1) // Egzemplarz typu NSNumber.
marr.add(2) // Egzemplarz typu NSNumber.
let arr = marr as NSArray as! [Int]



let pep = ["Mariusz", "Mieczysław", "Jacek"] as NSArray
let ems = pep.objects(
    at: pep.indexesOfObjects { (obj, idx, stop) -> Bool in
        return (obj as! NSString).range(
            of: "m", options:.caseInsensitive
            ).location == 0
    }
) // Dane wyjściowe: ["Mariusz", "Mieczysław"].



let arr = ["zero", "jeden", "dwa", "trzy", "cztery", "pięć",
    "sześć", "siedem", "osiem", "dziewięć", "dziesięć"]
var ixs = IndexSet()
ixs.insert(integersIn: Range(1...4))
ixs.insert(integersIn: Range(8...10))
let arr2 = (arr as NSArray).objects(at:ixs)
// Dane wyjściowe: ["jeden", "dwa", "trzy", "cztery", "osiem", "dziewięć", "dziesięć"].



let arr = ["Mariusz", "Mieczysław", "Jacek"]
let fm = FileManager.default
let temp = fm.temporaryDirectory
let f = temp.appendingPathComponent("pep.plist")
try! (arr as NSArray).write(to: f)



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Mariusz</string>
    <string>Mieczysław</string>
    <string>Jacek</string>
</array>
</plist>



let arr = ["Mariusz", "Mieczysław", "Jacek"]
let fm = FileManager.default
let temp = fm.temporaryDirectory
let f = temp.appendingPathComponent("pep.plist")
let penc = PropertyListEncoder()
penc.outputFormat = .xml
let d = try! penc.encode(arr)
try! d.write(to: f)



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Mariusz</string>
    <string>Mieczysław</string>
    <string>Jacek</string>
</array>
</plist>



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Mariusz</string>
    <string>Mieczysław</string>
    <string>Jacek</string>
</array>
</plist>



struct Person : Codable {
    let firstName : String
    let lastName : String
}



let p = Person(firstName: "Matt", lastName: "Neuburg")
let penc = PropertyListEncoder()
penc.outputFormat = .xml
let d = try! penc.encode(p)



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>firstName</key>
    <string>Matt</string>
    <key>lastName</key>
    <string>Neuburg</string>
</dict>
</plist>



let ud = UserDefaults.standard
let p = Person(firstName: "Matt", lastName: "Neuburg")
let pdata = try! PropertyListEncoder().encode(p)
ud.set(pdata, forKey: "person")



let p = Person(firstName: "Matt", lastName: "Neuburg")
let jenc = JSONEncoder()
jenc.outputFormatting = .prettyPrinted
let d = try! jenc.encode(p)
print(String(data:d, encoding:.utf8)!)
/*
{
  "firstName" : "Matt",
  "lastName" : "Neuburg"
}
*/



class ViewController: UIViewController {
    @objc var color : UIColor {
        get {
            print("Metoda getter została wywołana.")
            return .red
        }
        set {
            print("Metoda setter została wywołana.")
        }
    }
}



class MyView: UIView {
    override var frame : CGRect {
        didSet {
            print("Została wywołana metoda setter właściwości frame: \(super.frame).")
        }
    }
}



NSInteger tag = g.view.tag; // Tag wskazuje, która etykieta została naciśnięta.
NSString* key = nil;
switch (tag) {
    case 1: key = @"lesson"; break;
    case 2: key = @"lessonSection"; break;
    case 3: key = @"lessonSectionPartFirstWord"; break;
}
// Pobranie bieżącej wartości odpowiedniej zmiennej egzemplarza.
NSString* curValue = [[self currentCardController].term valueForKey: key];



let tag = g.view!.tag - 1
let arr : [(Term) -> String] = [
    {$0.lesson}, {$0.lessonSection}, {$0.lessonSectionPartFirstWord}
]
let f = arr[tag]
let curValue = f(self.currentCardController().term)



@objc var theData = [
    [
        "description" : "To ten w okularach.",
        "name" : "Mariusz"
    ],
    [
        "description" : "To ten, który wygląda jak Jan Nowak.",
        "name" : "Mieczysław"
    ],
    [
        "description" : "To ten bez wąsów.",
        "name" : "Jacek"
    ]
]










